我有一个新发现的利益在建设一个小型、高效的网络服务器在C和已经取得了一些麻烦分析后方法从HTTP头。有人会有任何建议如何处理检索的名称/价值对从"发布"的数据?

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

我没有看到有形的方式检索的底线作为一个整体并确保它的工作。我不是一个风扇的硬盘编码,在任何东西。

有帮助吗?

解决方案

你可以检索的名称值对通过搜索行newline或更具体 (在此之后,该主体的信息将开始)。

然后你可以简单地拆分列的&,然后分割的每一个这些返回串之间=name/value对。

看看 HTTP1.1RFC.

其他提示

一旦你有内容的长度的头,你知道量字节的读之后的空行。如果由于任何原因(获得或以后)的内容的长不在的标题,这意味着没有什么可以读之后的空白线(crlf).

你需要继续分析流作为标题,直到你看到的空行。其余的职位的数据。

你需要编写一个小析后的数据。你可以使用C库程序做一些快速和肮脏的像索引,strtok,并sscanf.如果你有空间,它在定义中的"小",你可以做一些更详细的与一个定期表达库、或甚至与flex和野牛。

至少,我认为这样的回答你的问题。

IETF RFC尽管如此,这里是一个更重要的是答案。假设你知道,总有一个额外的 /r/nContent-Length 线头,你应该能够做到的工作来孤立它成 char* 变量 data.我们在这里开始。

char *data = "f1=asfd&f2=a3f3f3";
char f1[100], 
char f2[100];
sscanf(data, "%s&%s", &f1, &f2); // get the field tuples

char f1_name[50];
char f1_data[50];
sscanf(f1, "%s=%s", f1_name, f1_data);  

char f2_name[50];
char f2_data[50];
sscanf(f2, "%s=%s", f2_name, f2_data);  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top