使用GZIP压缩在HTTP请求中切断内容(仅在浏览器中)

时间:2011-02-26 14:06:38

标签: http browser haskell gzip

我正在使用Yesod Web框架在Haskell中开发一个Web应用程序(尽管我认为这个问题与Haskell和/或Yesod没有关系,我只是提到这个问题是为了完整性)。我正在使用Warp服务器来提供请求,当使用涉及GZIP压缩的Chromium / Firefox(但不是Opera)访问网站时,我遇到了一个奇怪的问题。

我的网站设置只返回Hello world!

  • 如果我使用netcat获取网站并将Accept-Encoding设置为gzip,我会得到正确的结果。这意味着我可以解压缩收到的数据并正确解压缩到Hello world!
  • 如果我想使用Chromium或Firefox查看网站,我得到的只是H(其余内容被截断)。我确认服务器正确设置了Content-LengthContent-Encoding标头。

以下是我用来发送Hello world!字符串的代码:

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

我用标准run函数调用Warp:

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。这包很好看我很难。

所以出于某种原因,它只是不适用于Chromium或Firefox,我无法弄清楚原因。任何人都可以帮我这个或指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

最可能的原因是未正确设置Content-Length,即服务器报告原始内容的大小而不是压缩数据的大小。 正如上面的sclv所述,这必定是Web服务器中的错误。

答案 1 :(得分:1)

我可以确认这是wai-extra中的一个错误。似乎正确的操作应该是在使用gzip时删除Content-Length标头,以便Warp将自动提供分块传输编码。我希望今天晚些时候发布补丁。