我正在创建一个简单的 HTTP 服务器,它需要理解 HTTP 请求,
但是像 chromium 这样的浏览器使用了 HTTP Pipelining 技术,这意味着在一个连接中可以发送多个 HTTP 请求。
现在我很难分清多个 HTTP 请求之间的界限,一个明显的例子是一个 GET 请求加上一个表单上传随机数据。
我现在想到的是,将我收到的所有数据拆分为 \r\n
,然后检查每一行,看它是否像 HTTP 请求,例如 ^( GET|PUT|HEAD|POST|MOVE|TRACE)/[^ ]+ HTTP/[0-9]+\.[0-9]+$
但这仍然可能是错误的,有什么想法吗? (请不要告诉我使用现有的 HTTP 服务器库......我正在练习一些东西)
最佳答案
仔细阅读RFC 2616 , HTTP 协议(protocol)规范。一个 HTTP 请求由这些部分组成:
- 起跑线
- 零个或多个标题行
- 空行
- 请求正文
您首先分析起始行,这涉及读取直到第一个换行符(回车和换行符,CRLF)。然后,您通过阅读行来阅读标题,直到您阅读一个空行(即两个连续的 CRLF 对)。
阅读 header 后,您可以通过查看是否有 Content-Length
和/或 Transfer-Encoding
来确定是否有请求正文 header 。如果你确实得到了其中任何一个,那么它们会告诉你请求主体有多长,然后你读取那么多数据(这可能需要多次读取,例如使用 chunked
传输编码)。
阅读请求正文后,您就完成了!然后您就可以阅读下一个请求了。
关于c - 解析HTTP数据包的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460819/