C 解析HTTP头

C 解析HTTP头,c,http,post,header,C,Http,Post,Header,我对用C语言构建一个小型、高效的web服务器产生了新的兴趣,并且在从HTTP头解析POST方法时遇到了一些问题。对于如何从“发布的”数据中检索名称/值对,有人有什么建议吗 我看不到任何切实可行的方法来恢复整个底线,并确保它每次都有效。我不喜欢任何硬编码。您可以通过搜索换行符或更具体地说\r\n\r\n来检索名称/值对(在此之后,消息正文将开始) 然后,您可以简单地用&来拆分列表,然后在=for name/value对之间拆分每个返回的字符串 参见.< /p> ,您需要将流解析为标题,直到您看到空

我对用C语言构建一个小型、高效的web服务器产生了新的兴趣,并且在从HTTP头解析POST方法时遇到了一些问题。对于如何从“发布的”数据中检索名称/值对,有人有什么建议吗


我看不到任何切实可行的方法来恢复整个底线,并确保它每次都有效。我不喜欢任何硬编码。

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

然后,您可以简单地用&来拆分列表,然后在=for name/value对之间拆分每个返回的字符串


参见.< /p> ,您需要将流解析为标题,直到您看到空白行。其余的是POST数据

您需要为post数据编写一个小解析器。您可以使用C库例程快速完成一些肮脏的工作,比如索引、strtok和sscanf。如果您在“small”的定义中有足够的空间,您可以使用正则表达式库,甚至使用flex和bison来做一些更详细的事情


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

一旦你在页眉中有了内容长度,你就知道在空白行之后要读取的字节数。如果由于任何原因(get或POST)内容长度不在页眉中,则意味着在空白行(CRLF)之后没有什么可读性。

IETF RFC,尽管这里有一个更贴切的答案。假设您意识到在标题中的

内容长度
行之后总是有一个额外的
/r/n
,您应该能够将其隔离到名为
数据
char*
变量中。这就是我们的出发点

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);  

啊,谢谢。我注意到在名称/值对的字符串前面有一个额外的空格,但没有将二和二放在一起。@rofly:不要计算二和二,只要阅读标准(RFC 2616)。这在第4.1节中。请注意,有些不符合要求的客户端使用“有趣的”标题结尾,例如“\n\n”或“\n\r\n”。请注意,除了application/x-www-form-urlencoded之外,还有其他内容类型。它可以是任何类型,例如json很流行。
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);