Ruby Net :: HTTP不解码gzip?

我已经安装了zlib的ruby-1.9.3-p327localhost:80nginx的简单testing页面。

 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..." 

身体没有解码。 为什么?

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

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

对于那些在代码方面出现问题的人来说,在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 

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

你可以在这个GitHub问题上阅读更多关于这个问题。

我认为这不会自动执行。

要解码,请尝试下面的代码片断(假设响应是一个StringIO):

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