我有兴趣在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

我认为没有切实可行的方法来检索整体的底线并确保它每次都有效。 我不喜欢硬编码。

===============>>#1 票数:20 已采纳

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

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

请参阅HTTP 1.1 RFC

===============>>#2 票数:4

一旦在标题中有Content-Length,就会知道在空白行之后要读取的字节数。 如果由于任何原因(GET或POST)Content-Length不在标题中,则表示在空白行(crlf)之后没有任何内容可读。

===============>>#3 票数:2

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

您需要为post数据编写一个小解析器。 您可以使用C库例程来执行快速和脏的操作,例如index,strtok和sscanf。 如果你在“小”的定义中有空间,你可以使用正则表达式库,甚至是flex和bison来做更精细的事情。

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

===============>>#4 票数:0

IETF RFC尽管如此,这里有一个更重要的答案。 假设你意识到在标题中的Content-Length行之后总是有一个额外的/r/n ,你应该能够把它分离成一个名为datachar*变量。 这是我们开始的地方。

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

  ask by Chuck Callebs translate from so

未解决问题?本站智能推荐:

2回复

HTTP标头变为小写2

我需要通过http post发送UPPERcased标头。 这里描述了故事的第一部分。 现在它的时间到了。 :) 这里有两个问题。 没用 :)服务器的servlet接收: 工作流程= TSM \\ soapaction = requestCreditBure
1回复

从HTTP标头复制Post操作

我正在尝试向网站发送远程发布操作,以在特定时间间隔自动从一种状态更改为另一种状态,但是,我无法解密HTTP标头信息以获得所需的结果。 每次我发送帖子时,网站均不接受该帖子,因此很明显,我错误地解析了该帖子。 我捕获的有效HTTP标头信息如下: 有人可以为我提供的任何帮助都会很棒。
3回复

C,解析一些http标头

我在解析http标头时遇到了一些麻烦。 这是我的问题: 我认为使用sscanf是个好主意,因为我只想获取一些值(如果它们存在)。 我的想法是跳过所有我不想要的标题。 我的问题是: 1-sscanf是个好主意吗? 2-如果不是,哪种方法会更好 谢谢。
3回复

使用标头时,Angular $ http执行两次

我正在开发一个离子项目,并且在每个POST和GET请求中使用标头参数。 但是,当我在Android Phone上测试项目并监视通过我的android设备进入服务器的所有请求时,没有任何问题。 但是,当我部署离子项目并在Web浏览器(Chrome Web浏览器)中对其进行测试时,我看到每个请求
2回复

删除HTTP标头信息

在C中是否有一种方法可以在套接字上使用recv()时排除数据附带的HTTP头信息? 我试图读取一些二进制数据,我想要的只是实际的二进制信息,而不是HTTP头信息。 收到的当前数据如下所示: 我只想阅读文件的二进制部分。 (这显然不是所有的二进制文件,只是显示了那么多,因为我将rec
2回复

无法修改标头信息

这个问题已经在这里有了答案: 如何修复PHP 11中的 “标题已发送”错误 我有一个登录页面,用户可以在其中选择一个选项。 然后它必须显示一个图形。 但是我得到这个错误 无法修改标头信息-在第126行的/var/www/databin/php/visual
1回复

POST请求,无法在客户端,更新数据库和重定向后设置标头

我试图更新我的更新我的mongodb数据库,然后将用户重定向回带有表单的页面。 这是“在发送给客户端后无法设置标题”的常见问题,这些标题经常发布在此处,但无法找到解决问题的方法。 我正在使用nodeJS和express,没有php或jquery。 我收到错误'无法在将邮件发送
1回复

如何使用C编程设置Http标头字段

我有保存/读取http标头的代码,但是在我的应用程序中,我想设置一个HTTP响应标头并将其发送到我的客户端。 那么,如何为客户端发送的任何请求设置http标头响应? 这是我的代码:
1回复

C中http标头的正则表达式

我想从http标头中提取字符串,例如:使用正则表达式GET http://www.example.com HTTP/1.1 。 我使用这种模式: ^([A-Za-z]+)(\\s+)(http?):\\/\\/(.*)(\\s+)(HTTP\\/)([0-9].[0-9])并且效果很好,并且将
2回复

HTTP请求和响应参数

我在这里遇到有关POST HTTP请求的情况:(此处使用的主机和链接已启动并正在运行) 当我将上面的请求字符串发送给主机时,然后服务器向我发送了奇怪的东西(以及预期的结果) 我用python中的urllib模块检查了请求,这只给了我预期的输出(这里我省略了响应详细信息)