2011-02-26 60 views
2

我正在開發使用耶索德Web框架(altough我認爲這個問題是不相關的Haskell和/或耶索德,我在Haskell一個Web應用程序HTTP請求切斷只是爲了完整性而提及這一點)。我使用Warp服務器來處理請求,並且在使用涉及GZIP壓縮的Chromium/Firefox(但不是Opera)訪問網站時遇到了一個奇怪的問題。內容獲取與GZIP壓縮(僅適用於瀏覽器)

我有一個網站建立僅Hello world!返回。

  • 如果我取使用netcat的網站,我設置Accept-Encodinggzip,我得到正確的結果。這意味着我可以解壓縮我收到的數據並將其正確解壓至Hello world!
  • 如果我想看看使用鉻或Firefox的網站,我得到的是H(內容的其餘部分被切斷)。我確認服務器正確設置了標頭Content-LengthContent-Encoding

這裏是我用來發送Hello world!串代碼:

getRootR = return $ RepPlain $ toContent ("Hello world!" :: ByteString) 

我打電話經與標準run功能:

withWebApp $ Warp.run 3000 

這是我的要求與netcat發送,與它的工作原理:

GET/HTTP/1.0 
Accept-Encoding: gzip,  

和解壓的netcat的輸出結果:

$ nc --idle-timeout=1 localhost 3000 < test | tail -n1 | gunzip 
nc: using stream socket 
Hello world! 

還有一兩件事:如果我使用Wireshark的數據包嗅探流量顯示爲HTTP流量,但Wireshark的告訴我(text/plain)Continuation or non-HTTP traffic。這個數據包對我來說很不錯。

所以,出於某種原因,它只是不會有鉻和Firefox,並且我想不通爲什麼。任何人都可以幫助我解決這個問題,或者指引我走向正確的方向嗎?

+0

只是一個盲目的鏡頭,當你GET GET HTTP://foo.bar/ HTTP時會發生什麼? – barsoap 2011-02-26 15:02:46

+0

你的意思是如果我通過netcat使用HTTP 1.1而不是HTTP 1.0來嘗試它?我得到相同的結果。 – Cedric 2011-02-26 16:22:31

+0

我敢打賭,這是經編gzip層的問題。所有這些東西都非常新,正在開發中。我會直接聯繫warp球員(特別是msnoyman),然後關閉gzip壓縮。 – sclv 2011-02-26 16:48:45

回答

3

最可能的原因是內容長度設置不正確,即服務器報告原始內容的大小而不是壓縮數據的大小。 正如上面的sclv所述,這必須是Web服務器中的一個錯誤。

+0

謝謝,那完全正確!內容長度匹配原始內容而不是壓縮內容。顯然,它與netcat一起工作,因爲我只是喂服務器發送的gunzip :-)。現在我只需要報告這一點。 – Cedric 2011-02-26 18:34:56

+1

只是爲了澄清:這不是* Warp中的錯誤,而是wai-extra中的錯誤。只要確定,如果你遇到了這個問題,你升級wai-extra; Warp的新版本根本不會影響這一點。 – 2011-02-27 10:33:02

1

我可以證實,這是圍額外的錯誤。看來,正確的操作應該是在使用gzip時刪除Content-Length標題,以便Warp將自動提供分塊傳輸編碼。我希望今天晚些時候發佈補丁。