解析HTTP标头

时间:2020-03-05 18:57:52  来源:igfitidea点击:

我对用C构建小型高效的Web服务器产生了新的兴趣,并且在解析HTTP Header中的POST方法时遇到了一些麻烦。关于如何处理从"已发布"数据中检索名称/值对的人,会有任何建议吗?

POST /test HTTP/1.1
Host: test-domain.com:7017
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://test-domain.com:7017/index.html
Cookie: __utma=43166241.217413299.1220726314.1221171690.1221200181.16; __utmz=43166241.1220726314.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

field1=asfd&field2=a3f3f3
// ^-this

我看不出有任何切实的方法来检索整个底线并确保每次都有效。我不喜欢硬编码任何东西。

解决方案

回答

我们可以通过搜索换行符换行符或者更具体地说\ r \ n \ r \ n来检索名称/值对(此后,消息正文将开始)。

然后,我们可以简单地用&分隔列表,然后在名称/值对的=之间分隔所有返回的字符串。

请参阅HTTP 1.1 RFC。

回答

我们需要继续将流解析为标题,直到看到空白行。其余的是POST数据。

我们需要为发布数据编写一个小解析器。我们可以使用C库例程执行快速而肮脏的操作,例如index,strtok和sscanf。如果我们在"小"的定义中有足够的空间,则可以使用正则表达式库甚至使用flex和bison进行更精细的处理。

至少,我认为这种方式可以回答问题。

回答

一旦在标头中具有Content-Length,就知道在空白行之后立即读取的字节数。如果由于某种原因(GET或者POST)Content-Length不在标题中,则意味着在空行(crlf)之后没有要读取的内容。