用于分块编码 POST 的 HTTP 标头 - 错误 411
Posted
技术标签:
【中文标题】用于分块编码 POST 的 HTTP 标头 - 错误 411【英文标题】:HTTP headers for chunked encoding POST - Error 411 【发布时间】:2013-06-19 18:49:03 【问题描述】:我正在使用Arduino which requires constructing an html POST line-by-line 向服务器发送数据。我不一定知道 Content-Length a-priori,所以我使用“分块”编码。
当我尝试使用this example post from Wikipedia 和"Transfer-Encoding" option as specified in rfc2616 时
client.println("POST /myurl HTTP/1.1");
client.println("Host: 12.345.679.999"); // replaced with the test server's IP
client.println("User-Agent: Arduino/1.0");
client.println("Transfer-Encoding: chunked");
client.println();
client.println("4");
client.println("test");
client.println("0");
client.println();
或者,使用明确的转义字符:
client.print("4\r\ntest\r\n0\r\n\r\n");
我从我的服务器收到错误:
HTTP/1.1 411 Length Required
A request of the requested method POST requires a valid Content-length.
Server: Apache/2.2.22 (Ubuntu)
但是,“分块”编码不应该需要 Content-Length 标头字段,请参阅4.4 - Message Length in rfc2616
我错过了一个字段吗?为什么这个调用不起作用?
作为记录,非分块编码有效:
if(client.connect(server, 80))
String PostData = "test";
Serial.println("POST /myurl HTTP/1.1");
client.println("Host: 12.345.679.999"); // replaced with the test server's IP
Serial.println("User-Agent: Arduino/1.0");
Serial.print("Content-Length: ");
Serial.println(PostData.length());
Serial.println();
Serial.println(PostData);
更新
来自 apache2 error.log:“分块传输编码禁止”
【问题讨论】:
不,你没有做错什么。它不起作用,因为编写服务器的人决定对包含实体主体的请求要求Content-Length
标头。如果您允许分块实体主体,则解析请求消息会更加复杂,因为您必须在数据到达时对其进行解析,而如果您知道长度,则只需读取该字节数即可。如果服务器具有禁用Content-Length
要求的选项设置,则您的请求应该按预期工作。否则,您将陷入困境,因为“1.1 兼容”服务器无法正确处理分块请求。
相关:什么服务器软件正在监听请求?
谢谢。 Apache/2.2.22 (Ubuntu) 上的 Amazon EC2 服务器。所以我想我会深入研究 Apache httpd.conf 文件?
过去我在向 apache 服务器发送分块请求时没有遇到问题。您的请求行是否指定 POST /someurl HTTP/1.1
?因为如果您使用 1.0,我希望 HTTP/1.1 引入了 411 作为分块编码。否则,您应该能够进行一些谷歌搜索,以确定哪些设置可以说服 apache 接受分块请求。
是的,我的请求行就是这样。
【参考方案1】:
找到后
chunked Transfer-Encoding forbidden
在我的 Apache2 日志中,我得出结论,错误不在我所做的 POST 中。
我发现 modwsgi(apache 和 django 之间的中间层)默认不启用分块传输编码。 In the past, chunked wasn't supported at all
Refering to the change-log in the new version of modwsgi,我发现写了
WSGIChunkedRequest On
在我的 apache httpd.conf
文件中允许分块请求(不再出现 411 错误)
【讨论】:
啊,所以 WSGI 是罪魁祸首……很高兴你能解决这个问题。 通过上述方法,411 消失了,但我现在得到 400。如果我禁用分块传输,它会按预期工作。以上是关于用于分块编码 POST 的 HTTP 标头 - 错误 411的主要内容,如果未能解决你的问题,请参考以下文章