HttpServletRequest.getInputStream()不会解包分块的HTTP请求

时间:2016-09-07 01:27:51

标签: java http tomcat

我正在向内部系统发送HTTP分块请求。通过确保我可以发送没有块编码的小邮件,我确认其他因素没有发挥作用。

我的流程基本上是将Transfer-Encoding标题更改为chunked,并且我已删除Content-Length标题。另外,我正在使用内部ChunkedOutputStream已经存在很长时间了。

我能够连接,获取输出流并发送数据。然后,收件人返回200响应,以便看到请求已收到并成功处理。端点接收HTTP请求,并将数据直接流式传输到表中(使用HttpServletRequest.getInputStream())。

在检查流数据时,我可以看到流中的块编码信息尚未被Tomcat容器自动解包/解码。我一直在搜索Tomcat HTTPConnector文档,并且无法找到任何暗示分块编码的内容w.r.t如何在HttpServlet内处理块编码消息。我无法查看其他StackOverflow问题,因此我怀疑我遗漏了一些基本的东西。

我的问题归结为:

  • Tomcat应该根据我的请求自动解码分块编码并给我一个" clean"当我致电InputStream时,HttpServletRequest.getInputStream()
  • 如果是,是否需要更新配置才能启用此功能?我在标题中发送错误导致它返回未解码的流吗?
  • 如果不是,通常的做法是在Transfer-Encoding标题出现时将输入流包装在ChunkedInputStream或类似内容中吗?

1 个答案:

答案 0 :(得分:0)

这已经解决了。正如所料,这是我的基本情况。

我使用的遗留系统提供了手动方法,以简化打开HTTP连接,发送标头然后使用OutputStream通过POST发送内容的过程。我没有意识到,而且它处于一个相当模糊的位置,但幕后的帮助者我们正在确定我指定一个{{ 1}}因此添加了Content-Length标头并将OutputStream包装在TRANSFER_ENCODING=chunked中。这导致我对内容进行双重编码,因此我的端点(貌似)无法对其进行解码。

案件结案。