解析HTTP数据包的正确方法是什么?

时间:2013-07-04 02:05:04

标签: c parsing http

我正在创建一个简单的HTTP服务器,需要了解HTTP请求,

但像Chrome这样的浏览器使用HTTP Pipelining技术,这意味着在单个连接中可以发送多个HTTP请求。

现在我发现很难说出多个HTTP请求之间的界限,一个明显的例子就是GET请求加上随机数据的表单上传。

我现在想到的是将我收到的所有数据与\r\n分开,然后检查每一行,看看它是否像HTTP请求,例如^(GET|PUT|HEAD|POST|MOVE|TRACE) /[^ ]+ HTTP/[0-9]+\.[0-9]+$

但那可能仍然是错误的,任何想法? (请不要告诉我使用现有的HTTP服务器库......我正在练习一些东西)

2 个答案:

答案 0 :(得分:6)

仔细阅读HTTP协议的规范RFC 2616。 HTTP请求由以下部分组成:

  1. 起跑线
  2. 零个或多个标题行
  3. 空行
  4. 申请正文
  5. 首先解析起始行,包括读取直到第一个换行符(回车符和换行符,CRLF)。然后,通过读取行​​来读取标题,直到读取空行(即两个连续的CRLF对)。

    一旦您阅读了标题,就可以通过查看是否有Content-Length和/或Transfer-Encoding标题来确定是否存在请求正文。如果您确实得到了其中任何一个,那么这些会告诉您请求正文有多长,然后您会读取那么多数据(这可能需要多次读取,例如使用chunked传输编码)。

    在您阅读了请求正文后,您已经完成了!然后,您就可以阅读下一个请求了。

答案 1 :(得分:1)

如果您不愿意使用现有库,解析HTTP请求的方法是读取指定HTTP请求格式的RFC,然后编写代码以解析该格式的数据。

另请注意,HTTP Pipelining以及通过单个连接提交多个请求的任何功能都是HTTP 1.1功能:您永远不会 接受它。当然允许您的服务器读取单个请求,发送HTTP / 1.0响应并关闭连接。任何网络浏览器都应该优雅地接受它。