I'm sending data to a server with an Arduino which requires constructing an HTML POST line-by-line. I don't necessarily know the Content-Length a-priori, so I am using "chunked" encoding.
When I tried this example post from Wikipedia with the "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();
or, with escape characters explicit:
client.print("4\r\ntest\r\n0\r\n\r\n");
I receive the error from my server:
HTTP/1.1 411 Length Required
A request of the requested method POST requires a valid Content-length.
Server: Apache/2.2.22 (Ubuntu)
However, "chunked" encoding shouldn't require a Content-Length header field, see 4.4 - Message Length in rfc2616
Am I missing a field? Why doesn't this call work?
For the record, the non-Chunked-Encoding works:
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);
}
UPDATE
From the apache2 error.log: "chunked Transfer-Encoding forbidden"
Content-Length
header for requests containing an entity body. Parsing request messages is more complicated if you allow chunked entity bodies because you have to parse the data as it arrives whereas if you know the length you can just read that number of octets. If the server has an option setting to disable theContent-Length
requirement your request should work as expected. Otherwise, you're up the creek as the "1.1-compliant" server doesn't correctly handle chunked requests. – CouturierPOST /someurl HTTP/1.1
? Because if you used 1.0 I would expect a 411 as chunked encoding was introduced with HTTP/1.1. Otherwise, you should just be able to do some googling to figure out what settings will convince apache to accept chunked requests. – CouturierHost: mydomain.com
header it's possible that the request is being routed to another virtual host where content-length is required. Also, have you tried something basic like telnet to send a raw request that you know to be correct? – Couturier