cha*_*nce 6 java http http-content-length http-headers
我有一段Java代码将字节数组传输到HTTP服务器:
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);
Run Code Online (Sandbox Code Playgroud)
我使用此代码传输大小大于1024的字节数组.它运行良好.但实际的HTTP消息(由Wireshark捕获)显示Content-Length的值是实际大小而不是1024.为什么?
我在HTTP规范中搜索但没有发现任何提示.我没有使用任何Transfer-Encoding或Transfer-coding.
Joa*_*uer 16
我猜这HttpURLConnection将只是Content-Length用正确的值覆盖标题,因为它知道说谎它是不好的;-)
事实上:在线条535-550 sun.net.www.protocol.HttpURLConnection的Content-Length设置如果合适的话.这在用户指定的标头设置后发生,因此该值将被覆盖.
这是正确的:如果您传输的数据量与声明的数量不符,那么您只会混淆另一端.
检查它的来源sun.net.www.protocol.http.HttpURLConnection似乎有一个受限制的标题列表,并且在调用时将被忽略setRequestProperty.Content-Length在那个清单中.不幸的是,这似乎没有记录(至少我找不到任何关于此的文档,只讨论相关问题).
谷歌搜索引入此"功能"的ChangeSet中提到的错误ID(?),似乎此更改是作为对安全漏洞CVE-2010-3541和CVE-2010-3573(本主题的Redhat错误)的反应而引入的.
该限制可以手动系统属性设置被禁用sun.net.http.allowRestrictedHeaders,以true在JVM启动.