【发布时间】:2011-02-26 14:06:37
【问题描述】:
我正在使用 Yesod Web 框架在 Haskell 中开发一个 Web 应用程序(尽管我认为这个问题与 Haskell 和/或 Yesod 无关,我只是为了完整性而提到这个)。我正在使用 Warp 服务器来处理请求,但在使用 Chromium/Firefox(但不是 Opera)访问涉及 GZIP 压缩的网站时遇到了一个奇怪的问题。
我设置了一个只返回 Hello world! 的网站。
- 如果我使用
netcat获取站点并将Accept-Encoding设置为gzip,我会得到正确的结果。这意味着我可以解压缩收到的数据,并正确解压缩为Hello world!。 - 如果我想使用 Chromium 或 Firefox 查看该站点,我得到的只是
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 中不起作用,我不知道为什么。任何人都可以帮助我或指出正确的方向吗?
【问题讨论】:
-
只是一个盲注,当你
GET http://foo.bar/ HTTP/1.1时会发生什么? -
您的意思是,如果我通过 netcat 使用 HTTP 1.1 而不是 HTTP 1.0 尝试它?我得到了同样的结果。
-
我敢打赌这是 warp gzip 层的问题。所有这些东西都是非常新的并且正在开发中。我会直接联系 Warp 人员(尤其是 msnoyman),然后关闭 gzip 压缩。