Ruby Net :: HTTP没有解码gzip?

时间:2012-11-15 11:58:59

标签: ruby nginx gzip

我安装了zlib ruby​​-1.9.3-p327 localhost: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 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

如果您使用http.get,则应自动对其进行解码,但看起来request可能无法为您执行此操作。

这里有明确的解压缩gzip请求的代码,但仅适用于get方法: https://github.com/ruby/ruby/blob/v1_9_3_327/lib/net/http.rb#L1031

答案 2 :(得分:3)

根据我的实验,至少有一个原因是因为right_http_connection宝石。我测试了1.3.0和1.4.0版本。这个宝石猴补丁Net :: HTTP并导致解码GZipped响应的问题。

您可以在this GitHub issue中了解有关此问题的更多信息。

答案 3 :(得分:1)

我认为它不会自动完成。

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

begin
  Zlib::GzipReader.new(response).read
rescue Zlib::GzipFile::Error, Zlib::Error # Not gzipped
  response.rewind
  response.read
end