用于分块编码的HTTP标头POST - 错误411

Tom*_*ght 16 http arduino http-post http-error http-headers

我正在将数据发送到带有Arduino的服务器,这需要逐行构建HTML POST.我不一定知道Content-Length a-priori,所以我使用"chunked"编码.

当我尝试使用rfc2616中指定"Transfer-Encoding"选项从Wikipedia发布此示例帖子时

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();
Run Code Online (Sandbox Code Playgroud)

或者,使用转义字符显式:

client.print("4\r\ntest\r\n0\r\n\r\n");
Run Code Online (Sandbox Code Playgroud)

我从服务器收到错误:

HTTP/1.1 411 Length Required
A request of the requested method POST requires a valid Content-length.
Server: Apache/2.2.22 (Ubuntu)
Run Code Online (Sandbox Code Playgroud)

但是,"chunked"编码不应该要求Content-Length头字段,请参阅rfc2616中的4.4 - 消息长度

我错过了一个领域吗?为什么这个电话不起作用?

为了记录,非Chunked-Encoding工作:

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);
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

来自apache2 error.log:"chunked Transfer-Encoding forbidden"

Tom*_*ght 12

找到后

chunked Transfer-Encoding forbidden
Run Code Online (Sandbox Code Playgroud)

在我的Apache2日志中,我得出结论,错误不在我正在制作的POST中.

我发现modwsgi(apache和django之间的中间层)默认情况下不启用chunked transfer-encoding.在过去,根本没有支持chunked

参考modwsgi新版本中的change-log,我发现了写作

WSGIChunkedRequest On
Run Code Online (Sandbox Code Playgroud)

在我的apache httpd.conf文件中允许chunked请求(不再有411错误)