web-dev-qa-db-ja.com

チャンクエンコーディングのHTTPヘッダーPOST-エラー411

HTMLの構築が必要なArduino POST line-by-line 。Content-Lengthaを必ずしも知らないサーバーにデータを送信しています。 -prioriなので、「チャンク」エンコーディングを使用しています。

私が試したとき ウィキペディアからのこの例の投稿rfc2616で指定されている "Transfer-Encoding"オプション

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-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から:「チャンク転送-エンコーディングは禁止されています」

16
Tom Wainwright

見つけた後

chunked Transfer-Encoding forbidden

私のApache2ログで、エラーは私が作成していたPOST)にはないと結論付けました。

Modwsgi(ApacheとDjangoの中間層)では、デフォルトでチャンク転送エンコーディングが有効になっていないことがわかりました。 以前は、チャンクはまったくサポートされていませんでした

modwsgiの新しいバージョンの変更ログを参照

WSGIChunkedRequest On

私のApacheでhttpd.confファイルはチャンク化されたリクエストを許可しました(これ以上411エラーはありません)

12
Tom Wainwright