2016-01-29 24 views
1

Tomcat將完全讀取請求標頭,但POST正文需要被servlet讀取。Tomcat在servlet未讀取的情況下,將請求正文作爲請求頭保存在活動連接中

我的問題是如果servlet沒有讀取它而發送響應請求主體會發生什麼?對於大多數情況下的HTTP/1.1,當連接爲keep alive時,丟棄或作爲下一個請求的請求標頭。

我認爲這是一個錯誤nginx正確處理這種情況。但是我沒有在bz.apache.org中發現任何錯誤報告。

在這種情況下,網絡服務器的假設行爲是什麼?

Tomcat版本:7.0.55,請求正文使用Content-Length而不是chunked發送。

背景:

我有兩個POST要求都有請求體(JSON字符串)使用一個連接(HTTP/1.1與繼續活着默認)發送,但對於第一次請求的servlet沒有讀取請求體,tomcat將此請求主體作爲下一個請求標題,客戶端得到HTTP/1.1 505 HTTP Version Not Supported。在tomcat的訪問日誌中,請求url是請求主體,一個json字符串。

10.128.8.6 - - [29/Jan/2016:09:47:30 +0800] "POST /action1.do HTTP/1.1" 200 57 
10.128.8.6 - - [29/Jan/2016:09:47:30 +0800] "[123]POST /action2.do HTTP/1.1" 505 - 
+0

它也可能是一個客戶端錯誤 - 請求不會被糾正。客戶是什麼? – ZhongYu

+0

如果您有合法的測試用例,請將其提交給'security @ tomcat.apache.org'。如果它需要nginx,那麼它可能是nginx中的一個bug,但現在它更可能是某種配置錯誤。 –

回答

2

如果未讀取正文以處理請求,則正文將被丟棄。

這與Tomcat或servlet無關,而是關於HTTP協議。 HTTP協議是無狀態的,並且您詢問的行爲將要求服務器記住第一個請求的主體:將該信息保存爲某種狀態。這樣做也沒有意義:POST請求的主體不太可能包含可以被解釋爲請求頭的字節。

Tomcat我們不可能有這樣一個根本性和破壞性的錯誤。如果你認爲你看到了這樣的錯誤,那麼你可能會誤解某些東西。

+0

那麼'它發生在我們的生產代碼中的一個不正確的實現接口,並得到'HTTP/1.1 505 HTTP版本不支持' – D3Hunter

相關問題