我正在创建一个简单的HTTP服务器,需要了解HTTP请求,
但像Chrome这样的浏览器使用HTTP Pipelining技术,这意味着在单个连接中可以发送多个HTTP请求。
现在我发现很难说出多个HTTP请求之间的界限,一个明显的例子就是GET请求加上随机数据的表单上传。
我现在想到的是将我收到的所有数据与\r\n
分开,然后检查每一行,看看它是否像HTTP请求,例如^(GET|PUT|HEAD|POST|MOVE|TRACE) /[^ ]+ HTTP/[0-9]+\.[0-9]+$
但那可能仍然是错误的,任何想法? (请不要告诉我使用现有的HTTP服务器库......我正在练习一些东西)
答案 0 :(得分:6)
仔细阅读HTTP协议的规范RFC 2616。 HTTP请求由以下部分组成:
首先解析起始行,包括读取直到第一个换行符(回车符和换行符,CRLF)。然后,通过读取行来读取标题,直到读取空行(即两个连续的CRLF对)。
一旦您阅读了标题,就可以通过查看是否有Content-Length
和/或Transfer-Encoding
标题来确定是否存在请求正文。如果您确实得到了其中任何一个,那么这些会告诉您请求正文有多长,然后您会读取那么多数据(这可能需要多次读取,例如使用chunked
传输编码)。
在您阅读了请求正文后,您已经完成了!然后,您就可以阅读下一个请求了。
答案 1 :(得分:1)
如果您不愿意使用现有库,解析HTTP请求的方法是读取指定HTTP请求格式的RFC,然后编写代码以解析该格式的数据。
另请注意,HTTP Pipelining以及通过单个连接提交多个请求的任何功能都是HTTP 1.1功能:您永远不会 接受它。当然允许您的服务器读取单个请求,发送HTTP / 1.0响应并关闭连接。任何网络浏览器都应该优雅地接受它。