2016-09-07 32 views
0

我正在向內部系統發送HTTP分塊請求。我已經確認其他因素不能確保我可以發送沒有塊編碼的小消息。HttpServletRequest.getInputStream()不解開分塊的HTTP請求

我的過程基本上是將Transfer-Encoding標題更改爲chunked,並且我刪除了Content-Length標題。此外,我正在使用內部已經存在相當一段時間的內部ChunkedOutputStream

我能夠連接,獲取輸出流併發送數據。收件人然後返回一個200響應,看起來該請求已收到併成功處理。端點接收HTTP請求,並將數據直接傳輸到表中(使用HttpServletRequest.getInputStream())。

在檢查流式數據時,我可以看到流中的塊編碼信息沒有被Tomcat容器自動解包/解碼。我一直在搜尋Tomcat HTTPConnector文檔,找不到任何暗示分塊編碼的內容w.r.如何在HttpServlet內處理塊編碼消息。我看不到其他StackOverflow問題,因此我懷疑我缺少一些基本的東西。

我的問題歸結爲:

  • 的Tomcat是否應自動從我的要求解碼分塊編碼,並給我一個「乾淨」 InputStream當我打電話HttpServletRequest.getInputStream()
  • 如果是,是否需要更新配置才能啓用此功能?我是否在標題中發送了錯誤信息,導致它返回未解碼的流?
  • 如果否,當Transfer-Encoding標題存在時,是否將輸入流換行爲ChunkedInputStream或類似的東西?

回答

0

這已解決。正如預期的那樣,這對我來說是基本的。

我使用的遺留系統提供了手動方法來簡化打開HTTP連接,發送標頭然後使用OutputStream通過POST發送內容的過程。我沒有意識到,這是在一個相當模糊的位置,但幕後幫手的我們確定我是而不是指定Content-Length因此添加了TRANSFER_ENCODING=chunked標題並將OutputStream封裝在ChunkedOutputStream中。這導致我對內容進行雙重編碼,因此我的終端(看起來)無法對其進行解碼。

案件關閉。

+0

他們應該使用'HttpURLConnection'。它已經內置了分塊。我不知道爲什麼人們不斷重新發明輪子。 – EJP

+0

完全同意。真的,這是我的一個明顯的疏忽。遺留系統已有15年以上的歷史,所以我並不感到驚訝,但事情並不理想,但我應該注意到。 –