接收HTTP标头

时间:2011-07-10 09:45:54

标签: c++ http parsing webserver httprequest

在教育方面,我正在用C ++编写HTTP服务器。 收到请求时,如何知道客户端何时完成发送标头?是否有义务一次性发送所有标题?如果客户发送G,然后在5秒E之后发送T,该怎么办?我应该等待超时并且如果花费太长时间就关闭连接吗?我是否应该在获得第一个字节后立即开始解析以了解请求是否无效?

我知道有很多这样的库,我只是重新发明轮子以更好地理解Web在不同层的工作方式。我无法找到他们如何处理我的问题。

4 个答案:

答案 0 :(得分:5)

根据HTTP 1.1 RFC (4.1)

    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”)。

除此之外,一些请求还有一个正文(通常是使用POSTPUT的正文)。如果请求具有邮件正文,则其长度将由Content-Length标头或通过chunked transfer encoding使用分隔符给出。

答案 2 :(得分:3)

HTTP标头通过\r\n\r\n与正文分隔,即双重换行符。这是你唯一可以依赖的东西。

答案 3 :(得分:1)

我建议你阅读HTTP protocol。具体来说,标题以双换行为界限。