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

标签 c parsing http

我正在创建一个简单的 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 请求由这些部分组成:

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

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

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

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

关于c - 解析HTTP数据包的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460819/

相关文章:

c - C中的十六进制算术

java - 如何读取多级括号表达式之间的文本

c++ - 通用的 XML QDomElement 比较 - C++/Qt

http - 如何从沙盒 Paypal 获取交易ID

c - 出现 "undeclared identifier"错误?为什么?

c - 使用条件变量停止运行 pthreads 的最佳方法

ruby-on-rails - 如何安全地解析来自 Ruby 哈希的数据?

http - 使用 gzip 编码数据时应该发送多长的内容?

java - 请求不使用 PersistentCookieStore 中保存的 cookie

c - 在内存地址读取数组