gpt4 book ai didi

java - 为什么 Content-Length HTTP header 字段使用的值不同于 Java 代码中给出的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:17 26 4
gpt4 key购买 nike

我有一段 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 消息(由 Wireshark 捕获)显示 Content-Length 的值是实际大小而不是 1024。为什么?

我在 HTTP spec 中搜索但没有发现任何提示。我没有使用任何 Transfer-Encoding 或 Transfer-coding。

最佳答案

我猜 HttpURLConnection 会简单地用正确的值覆盖 Content-Length header ,因为它知道说谎这不好 ;-)

事实上:在 sun.net.www.protocol.HttpURLConnection 的第 535-550 行如果合适,Content-Length 会被设置。这发生在用户指定的 header 设置之后,因此该值将被覆盖。

这是正确的:如果您传输的数据量与声明的数量不符,那么您只会混淆另一端。

正在检查 the source of sun.net.www.protocol.http.HttpURLConnection似乎有一个 header 列表是受限制的,在调用 setRequestProperty 时将被静默忽略。 Content-Length 在该列表中。不幸的是,这似乎没有记录(至少我找不到关于此的任何文档,只有 a discussion of a related problem here )。

Google 搜索 the ChangeSet that introduced this "functionality" 中提到的 Bug ID (?)似乎引入此更改是为了应对安全漏洞 CVE-2010-3541CVE-2010-3573 (Redhat bug on this topic)。

可以通过在 JVM 启动时将系统属性 sun.net.http.allowRestrictedHeaders 设置为 true 来手动禁用限制。

关于java - 为什么 Content-Length HTTP header 字段使用的值不同于 Java 代码中给出的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com