1

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

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

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

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

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

4

2 回答 2

7

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

  1. 起跑线
  2. 零个或多个标题行
  3. 空行
  4. 请求正文

您首先解析起始行,这涉及到读取到第一个换行符(回车和换行,CRLF)。然后,通过读取行​​来读取标题,直到读取到空行(即两个连续的 CRLF 对)。

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

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

于 2013-07-04T02:16:47.787 回答
1

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

另请注意,HTTP Pipelining 和通过单个连接提交多个请求的任何能力都是 HTTP 1.1 的特性:您永远不必接受它。您的服务器当然可以读取单个请求、发送 HTTP/1.0 响应并关闭连接。任何网络浏览器都应该优雅地接受这一点。

于 2013-07-04T02:13:16.360 回答