为什么Content Length HTTP头字段使用Java代码中给定值以外的值?
我有一段Java代码将字节数组传输到HTTP服务器:为什么Content Length HTTP头字段使用Java代码中给定值以外的值?,java,http,http-headers,http-content-length,Java,Http,Http Headers,Http Content Length,我有一段Java代码将字节数组传输到HTTP服务器: HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestMethod("POST"); connection.setRequestP
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消息(由捕获)显示内容长度的值是实际大小,而不是1024。为什么?
我搜索了一下,但没有发现任何线索。我没有使用任何传输编码或传输编码。我猜
HttpURLConnection
将简单地用正确的值覆盖内容长度
标题,因为知道对它撒谎没有好处;-)
事实上:如果合适,在内容长度的第535-550行设置。这在设置用户指定的头之后发生,因此值将被覆盖
这一点是正确的:如果您传输的数据量与声明的数据量不匹配,那么您只会混淆另一端
检查是否存在受限制的标题列表,并且在调用setRequestProperty
时将被忽略<代码>内容长度
就是其中之一。不幸的是,这似乎是没有文档记录的(至少我找不到关于这方面的任何文档)
谷歌搜索中提到的Bug id(?)似乎是对安全漏洞和()的反应
通过在JVM启动时将系统属性sun.net.http.allowerPrictedHeaders
设置为true
,可以手动禁用该限制。这为我解决了:
connection.setFixedLengthStreamingMode(myString.getBytes().length);
conn.setRequestProperty("Content-length", String.valueOf(myString.getBytes().length));
“connection.setFixedLengthStreamingMode(myString.getBytes().length);”在设置内容长度标题之前。内容长度的值是错误地硬编码的。让我吃惊的是它居然能工作。我想知道为什么。你的猜测听起来很合理。但是在哪里可以找到它的文档呢?@joachim sauer:答案很好!但是我已经用sun.net.http.AllowerPrictedHeaders=true进行了测试,发现结果与以前一样。@王:我的冗长分析在这里并不适用,因为内容长度
无论如何都会被正确的值覆盖。我已经更新了我的答案。