5

我安装了 zlib的 ruby​​-1.9.3-p327localhost:80是nginx简单的测试页面。

require "net/http"
=> true
Net::HTTP::HAVE_ZLIB
=> true

res = Net::HTTP.start("localhost", "80") do |http|
  req = Net::HTTP::Get.new "/"
  req["accept-encoding"] = "gzip"
  http.request req
end
=> #<Net::HTTPOK 200 OK readbody=true>

res.get_fields "content-encoding"
=> ["gzip"]
res.body
=> "\x1F\x8B\b\x00\x00\x00\x00\x00\x00\x03\xEC\xBDi..."

尸体没有被解码。为什么?

4

4 回答 4

9

对于在 ruby​​ 1.9 上工作的代码遇到问题并且无法升级到 ruby​​ 2.0 的任何人,只需将该代码包含到您的项目中即可。

module HTTPResponseDecodeContentOverride
  def initialize(h,c,m)
    super(h,c,m)
    @decode_content = true
  end
  def body
    res = super
    if self['content-length']
      self['content-length']= res.bytesize
    end
    res
  end
end
module Net
  class HTTPResponse
    prepend HTTPResponseDecodeContentOverride
  end
end
于 2013-12-09T12:00:19.233 回答
6

如果你使用http.get它应该自动解码它,但它看起来request可能不适合你。

这里显然有解压gzip请求的代码,但只针对get方法: https ://github.com/ruby/ruby/blob/v1_9_3_327/lib/net/http.rb#L1031

于 2012-11-15T12:24:22.263 回答
3

根据我的实验,发生这种情况的至少一个原因是right_http_connection gem。我测试了 1.3.0 和 1.4.0 版本。这个 gem monkey 修补 Net::HTTP 并导致解码 GZipped 响应出现问题。

您可以在此 GitHub 问题中阅读有关此问题的更多信息。

于 2014-07-15T22:42:31.720 回答
1

我认为它不会自动完成。

要解码,请尝试以下代码段(假设响应是 StringIO):

begin
  Zlib::GzipReader.new(response).read
rescue Zlib::GzipFile::Error, Zlib::Error # Not gzipped
  response.rewind
  response.read
end
于 2012-11-15T12:16:07.790 回答