我正在使用 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
header 。
这是我用来发送 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 或非 HTTP 流量
。这个包对我来说看起来很好很硬。
由于某种原因,它在 Chromium 或 Firefox 中不起作用,我不明白为什么。有人可以帮助我解决这个问题或为我指出正确的方向吗?
最佳答案
最可能的原因是内容长度设置不正确,即服务器报告原始内容的大小而不是压缩数据的大小。 正如 sclv 上面所述,这一定是 Web 服务器中的错误。
关于http - 使用 GZIP 压缩的 HTTP 请求内容被截断(仅在浏览器中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5127327/