6

バイト配列を HTTP サーバーに転送する Java コードがあります。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="
    + myBoundary);
connection.setRequestProperty("Content-Length", 1024);

このコードを使用して、サイズが 1024 より大きいバイト配列を転送しました。うまくいきました。しかし、実際の HTTP メッセージ ( Wiresharkでキャプチャ) は、 Content-Length の値が 1024 ではなく実際のサイズであることを示しています。なぜでしょうか?

HTTP 仕様で検索しましたが、ヒントが見つかりませんでした。Transfer-Encoding または Transfer-coding は使用しませんでした。

4

2 に答える 2

16

嘘をつくのは良くないことを知っているので、ヘッダーを正しい値でHttpURLConnectionオーバーライドするだけだと思います;-)Content-Length

そして確かに: 行 535-550 でsun.net.www.protocol.HttpURLConnectionContent-Length適切な場合に設定されます。これは、ユーザー指定のヘッダーが設定された後に発生するため、その値は上書きされます。

その通りです。転送するデータの量が要求された量と一致しない場合、相手を混乱させるだけです。

ソースをsun.net.www.protocol.http.HttpURLConnection確認すると、制限されているヘッダーのリストがあり、呼び出し時に黙って無視されるようsetRequestPropertyです。Content-Lengthそのリストの中にあります。残念ながら、これは文書化されていないようです (少なくとも、これに関する文書は見つかりませんでした。ここでは関連する問題についての議論のみです)。

この「機能」を導入した ChangeSet で言及されているバグ ID (?) をグーグル検索すると、この変更はセキュリティ脆弱性CVE-2010-3541およびCVE-2010-3573 (このトピックに関する Redhat バグ)への対応として導入されたようです。 .

JVM の起動時にSystem プロパティsun.net.http.allowRestrictedHeadersをに設定することにより、この制限を手動で無効にすることができます。true

于 2011-05-19T09:06:45.387 に答える