5

zlib がインストールされた ruby​​-1.9.3-p327 がありますlocalhost:80nginxの簡易テストページです。

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 に答える
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 に答える