From ddddf044b27c87b0b2d5b31bb1ed2277f211ec1e Mon Sep 17 00:00:00 2001 From: naruse Date: Thu, 14 Feb 2013 15:51:45 +0000 Subject: merge revision(s) 39232,39233,39238: [Backport #7831][Backport #7852] * lib/net/http: Do not handle Content-Encoding when the user sets Accept-Encoding. This allows users to handle Content-Encoding for themselves. This restores backwards-compatibility with Ruby 1.x. * lib/net/http/generic_request.rb: ditto. * lib/net/http/response.rb: ditto * test/net/http/test_http.rb: Test for the above. * test/net/http/test_http_request.rb: ditto. * test/net/http/test_httpresponse.rb: ditto. [ruby-trunk - Bug #7831] * lib/net/http.rb: Removed OpenSSL dependency from Net::HTTP. * test/net/http/test_http.rb: Remove Zlib dependency from tests. * test/net/http/test_http_request.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@39244 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/net/http.rb | 5 ++++- lib/net/http/generic_request.rb | 19 +++++++++++++++++++ lib/net/http/response.rb | 6 ++++++ 3 files changed, 29 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/net/http.rb b/lib/net/http.rb index d460aeaa0b..cc1b1c4a1f 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -1410,6 +1410,7 @@ module Net #:nodoc: req.exec @socket, @curr_http_version, edit_path(req.path) begin res = HTTPResponse.read_new(@socket) + res.decode_content = req.decode_content end while res.kind_of?(HTTPContinue) res.uri = req.uri @@ -1423,7 +1424,9 @@ module Net #:nodoc: raise rescue Net::ReadTimeout, IOError, EOFError, Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE, - OpenSSL::SSL::SSLError, Timeout::Error => exception + # avoid a dependency on OpenSSL + defined?(OpenSSL::SSL) ? OpenSSL::SSL::SSLError : IOError, + Timeout::Error => exception if count == 0 && IDEMPOTENT_METHODS_.include?(req.method) count += 1 @socket.close if @socket and not @socket.closed? diff --git a/lib/net/http/generic_request.rb b/lib/net/http/generic_request.rb index e822ac9181..6e79bb9c2e 100644 --- a/lib/net/http/generic_request.rb +++ b/lib/net/http/generic_request.rb @@ -27,11 +27,14 @@ class Net::HTTPGenericRequest raise ArgumentError, "HTTP request path is empty" if path.empty? @path = path + @decode_content = false + if @response_has_body and Net::HTTP::HAVE_ZLIB then if !initheader || !initheader.keys.any? { |k| %w[accept-encoding range].include? k.downcase } then + @decode_content = true initheader = initheader ? initheader.dup : {} initheader["accept-encoding"] = "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" @@ -51,10 +54,25 @@ class Net::HTTPGenericRequest attr_reader :path attr_reader :uri + # Automatically set to false if the user sets the Accept-Encoding header. + # This indicates they wish to handle Content-encoding in responses + # themselves. + attr_reader :decode_content + def inspect "\#<#{self.class} #{@method}>" end + ## + # Don't automatically decode response content-encoding if the user indicates + # they want to handle it. + + def []=(key, val) # :nodoc: + @decode_content = false if key.downcase == 'accept-encoding' + + super key, val + end + def request_body_permitted? @request_has_body end @@ -291,6 +309,7 @@ class Net::HTTPGenericRequest if IO.select([sock.io], nil, nil, sock.continue_timeout) res = Net::HTTPResponse.read_new(sock) unless res.kind_of?(Net::HTTPContinue) + res.decode_content = @decode_content throw :response, res end end diff --git a/lib/net/http/response.rb b/lib/net/http/response.rb index bde3b5b440..da3e4b4c8c 100644 --- a/lib/net/http/response.rb +++ b/lib/net/http/response.rb @@ -80,6 +80,7 @@ class Net::HTTPResponse @body = nil @read = false @uri = nil + @decode_content = false end # The HTTP version supported by the server. @@ -98,6 +99,10 @@ class Net::HTTPResponse # if a URI was used to create the request. attr_reader :uri + # Set to true automatically when the request did not contain an + # Accept-Encoding header from the user. + attr_accessor :decode_content + def inspect "#<#{self.class} #{@code} #{@message} readbody=#{@read}>" end @@ -242,6 +247,7 @@ class Net::HTTPResponse def inflater # :nodoc: return yield @socket unless Net::HTTP::HAVE_ZLIB + return yield @socket unless @decode_content return yield @socket if self['content-range'] case self['content-encoding'] -- cgit v1.2.3