在教育方面,我正在用C ++编写HTTP服务器。
收到请求时,如何知道客户端何时完成发送标头?是否有义务一次性发送所有标题?如果客户发送G
,然后在5秒E
之后发送T
,该怎么办?我应该等待超时并且如果花费太长时间就关闭连接吗?我是否应该在获得第一个字节后立即开始解析以了解请求是否无效?
我知道有很多这样的库,我只是重新发明轮子以更好地理解Web在不同层的工作方式。我无法找到他们如何处理我的问题。
答案 0 :(得分:5)
generic-message = start-line
*(message-header CRLF)
CRLF
[ message-body ]
start-line = Request-Line | Status-Line
邮件标题后面有一个额外的CRLF。所以一旦你遇到序列CRLF - > CRLF,身体开始。
Concering timeout:您可以在收到字符后开始解析(等待CRLF,因此您知道标题已完成),一旦请求超过5秒左右,请发送回408 Request Timeout。
答案 1 :(得分:4)
这个答案有两个部分。
首先,延迟和超时的问题:你应该确实处理超时,因为通常不可能检测TCP连接是否被破坏。在这个问题中有更多关于此主题的内容:TCP socket in Unix - notify server I am done sending
其次,HTTP请求的格式定义(在RFC 2616, section 5中)如下:
Request = Request-Line ; Section 5.1
*(( general-header ; Section 4.5
| request-header ; Section 5.3
| entity-header ) CRLF) ; Section 7.1
CRLF
[ message-body ] ; Section 4.3
基本上,您获得请求行(例如GET /index.html HTTP/1.1
),后跟多个标题行(没有空行)。然后,标题列表以空行结束。行的所有末尾都用CRLF表示(“\r\n
”)。
除此之外,一些请求还有一个正文(通常是使用POST
或PUT
的正文)。如果请求具有邮件正文,则其长度将由Content-Length
标头或通过chunked transfer encoding使用分隔符给出。
答案 2 :(得分:3)
HTTP标头通过\r\n\r\n
与正文分隔,即双重换行符。这是你唯一可以依赖的东西。
答案 3 :(得分:1)
我建议你阅读HTTP protocol。具体来说,标题以双换行为界限。