响应中的重复标头“Transfer-Encoding”会导致客户端异常 - “java.io.IOException:块大小中的非法字符:123”

问题描述 投票:0回答:1

有 3 个 Spring Boot 服务(客户端、代理、API) - 客户端正在调用 API,请求通过代理发送/返回,大约 1% 的响应已损坏,客户端无法读取它 - 抛出 java.io.IOException:块大小中的非法字符:123。

这意味着响应被分块并且每个块都有大小。 由于字符“{”的十六进制表示为“123”,这意味着响应块大小值丢失,并且数据以“{”开头,这是 JSON 对象的开头。客户端收到标头“Transfer-Encoding”:分块 – 这是按块读取响应的指令,但由于块大小/分区大小丢失,客户端无法读取响应并抛出异常。

查看来自 API 的响应标头,它抛出代理,我可以看到有重复的标头“Transfer-Encoding”。我们发现 API 本身最初添加了这样的标头一次,这是当响应是动态的(来自 DB)时的正常行为 Spring/Tomcat 不知道内容长度并且它会对响应进行分块。而且当响应通过代理时,代理会再添加一个“Transfer-Encoding”标头。查看代理代码 - 它转换从 API 接收到的标头并转发它(所有标头都是唯一的,没有重复)。但代理内部 Tomcat 正在向响应添加额外的“Transfer-Encoding”标头。 看起来像 Tomcat 错误。 将 Spring Boot/Tomcat 版本升级到最新版本没有帮助。

此问题只能在加载期间重现 - 例如 300 个请求将产生大约 3-4 个错误。 在 API 端手动删除“Transfer-Encoding”标头(Content-Length 将自动添加)可以解决问题,但这似乎不是正确的解决方案。

请分享您的经验/提出解决方案。

java spring-boot tomcat proxy http-headers
1个回答
0
投票

能否提供代理端的最低实现代码或逻辑? 我猜可能是代理没有正确处理块传输的兼容性。

© www.soinside.com 2019 - 2024. All rights reserved.