我正在使用Yesod Web框架在Haskell中开发一个Web应用程序(尽管我认为这个问题与Haskell和/或Yesod没有关系,我只是提到这个问题是为了完整性)。我正在使用Warp服务器来提供请求,当使用涉及GZIP压缩的Chromium / Firefox(但不是Opera)访问网站时,我遇到了一个奇怪的问题。
我的网站设置只返回Hello world!
。
netcat
获取网站并将Accept-Encoding
设置为gzip
,我会得到正确的结果。这意味着我可以解压缩收到的数据并正确解压缩到Hello world!
。H
(其余内容被截断)。我确认服务器正确设置了Content-Length
和Content-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,我无法弄清楚原因。任何人都可以帮我这个或指出我正确的方向吗?
答案 0 :(得分:3)
最可能的原因是未正确设置Content-Length,即服务器报告原始内容的大小而不是压缩数据的大小。 正如上面的sclv所述,这必定是Web服务器中的错误。
答案 1 :(得分:1)
我可以确认这是wai-extra中的一个错误。似乎正确的操作应该是在使用gzip时删除Content-Length标头,以便Warp将自动提供分块传输编码。我希望今天晚些时候发布补丁。