为什么Content Length HTTP头字段使用Java代码中给定值以外的值?

为什么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

我有一段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);
我使用这段代码来传输一个大小大于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进行了测试,发现结果与以前一样。@王:我的冗长分析在这里并不适用,因为
内容长度
无论如何都会被正确的值覆盖。我已经更新了我的答案。