【问题标题】:Content gets cut off on HTTP request with GZIP compression (only in browser)内容被 GZIP 压缩的 HTTP 请求截断(仅在浏览器中)
【发布时间】: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-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 中不起作用,我不知道为什么。任何人都可以帮助我或指出正确的方向吗?

【问题讨论】:

  • 只是一个盲注,当你GET http://foo.bar/ HTTP/1.1时会发生什么?
  • 您的意思是,如果我通过 netcat 使用 HTTP 1.1 而不是 HTTP 1.0 尝试它?我得到了同样的结果。
  • 我敢打赌这是 warp gzip 层的问题。所有这些东西都是非常新的并且正在开发中。我会直接联系 Warp 人员(尤其是 msnoyman),然后关闭 gzip 压缩。

标签: http browser haskell gzip


【解决方案1】:

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

【讨论】:

  • 谢谢,完全正确! Content-Length 匹配原始内容而不是压缩内容。显然它适用于 netcat,因为无论服务器发送什么,我都只是喂了 gunzip :-)。现在我只需要报告这个。
  • 澄清一下:这不是 Warp 中的错误,而是 wai-extra 中的错误。请确保如果您遇到此问题,请升级 wai-extra;新版本的 Warp 根本不会影响这一点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多