[前][次][番号順一覧][スレッド一覧]

ruby-changes:27180

From: drbrain <ko1@a...>
Date: Thu, 14 Feb 2013 10:08:35 +0900 (JST)
Subject: [ruby-changes:27180] drbrain:r39232 (trunk): * lib/net/http: Do not handle Content-Encoding when the user sets

drbrain	2013-02-14 10:08:19 +0900 (Thu, 14 Feb 2013)

  New Revision: 39232

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39232

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/lib/net/http/generic_request.rb
    trunk/lib/net/http/response.rb
    trunk/lib/net/http.rb
    trunk/test/net/http/test_http.rb
    trunk/test/net/http/test_http_request.rb
    trunk/test/net/http/test_httpresponse.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 39231)
+++ ChangeLog	(revision 39232)
@@ -1,3 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Feb 14 10:05:57 2013  Eric Hodel  <drbrain@s...>
+
+	* 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.
+
 Thu Feb 14 08:18:47 2013  Tanaka Akira  <akr@f...>
 
 	* ext/socket/extconf.rb: don't define HAVE_SA_LEN and HAVE_SA_LEN.
Index: lib/net/http/response.rb
===================================================================
--- lib/net/http/response.rb	(revision 39231)
+++ lib/net/http/response.rb	(revision 39232)
@@ -80,6 +80,7 @@ class Net::HTTPResponse https://github.com/ruby/ruby/blob/trunk/lib/net/http/response.rb#L80
     @body = nil
     @read = false
     @uri  = nil
+    @decode_content = false
   end
 
   # The HTTP version supported by the server.
@@ -98,6 +99,10 @@ class Net::HTTPResponse https://github.com/ruby/ruby/blob/trunk/lib/net/http/response.rb#L99
   # 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 https://github.com/ruby/ruby/blob/trunk/lib/net/http/response.rb#L247
 
   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']
Index: lib/net/http/generic_request.rb
===================================================================
--- lib/net/http/generic_request.rb	(revision 39231)
+++ lib/net/http/generic_request.rb	(revision 39232)
@@ -27,11 +27,14 @@ class Net::HTTPGenericRequest https://github.com/ruby/ruby/blob/trunk/lib/net/http/generic_request.rb#L27
     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 https://github.com/ruby/ruby/blob/trunk/lib/net/http/generic_request.rb#L54
   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 https://github.com/ruby/ruby/blob/trunk/lib/net/http/generic_request.rb#L309
       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
Index: lib/net/http.rb
===================================================================
--- lib/net/http.rb	(revision 39231)
+++ lib/net/http.rb	(revision 39232)
@@ -1410,6 +1410,7 @@ module Net   #:nodoc: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L1410
           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
Index: test/net/http/test_httpresponse.rb
===================================================================
--- test/net/http/test_httpresponse.rb	(revision 39231)
+++ test/net/http/test_httpresponse.rb	(revision 39232)
@@ -86,6 +86,7 @@ x\x9C\xCBH\xCD\xC9\xC9\a\x00\x06,\x02\x1 https://github.com/ruby/ruby/blob/trunk/test/net/http/test_httpresponse.rb#L86
 EOS
 
     res = Net::HTTPResponse.read_new(io)
+    res.decode_content = true
 
     body = nil
 
@@ -118,6 +119,7 @@ x\x9C\xCBH\xCD\xC9 https://github.com/ruby/ruby/blob/trunk/test/net/http/test_httpresponse.rb#L119
 EOS
 
     res = Net::HTTPResponse.read_new(io)
+    res.decode_content = true
 
     body = nil
 
@@ -134,6 +136,29 @@ EOS https://github.com/ruby/ruby/blob/trunk/test/net/http/test_httpresponse.rb#L136
     end
   end
 
+  def test_read_body_content_encoding_deflate_disabled
+    io = dummy_io(<<EOS)
+HTTP/1.1 200 OK
+Connection: close
+Content-Encoding: deflate
+Content-Length: 13
+
+x\x9C\xCBH\xCD\xC9\xC9\a\x00\x06,\x02\x15
+EOS
+
+    res = Net::HTTPResponse.read_new(io)
+    res.decode_content = false # user set accept-encoding in request
+
+    body = nil
+
+    res.reading_body io, true do
+      body = res.read_body
+    end
+
+    assert_equal 'deflate', res['content-encoding'], 'Bug #7831'
+    assert_equal "x\x9C\xCBH\xCD\xC9\xC9\a\x00\x06,\x02\x15", body, 'Bug #7381'
+  end
+
   def test_read_body_content_encoding_deflate_no_length
     io = dummy_io(<<EOS)
 HTTP/1.1 200 OK
@@ -144,6 +169,7 @@ x\x9C\xCBH\xCD\xC9\xC9\a\x00\x06,\x02\x1 https://github.com/ruby/ruby/blob/trunk/test/net/http/test_httpresponse.rb#L169
 EOS
 
     res = Net::HTTPResponse.read_new(io)
+    res.decode_content = true
 
     body = nil
 
Index: test/net/http/test_http.rb
===================================================================
--- test/net/http/test_http.rb	(revision 39231)
+++ test/net/http/test_http.rb	(revision 39232)
@@ -419,6 +419,7 @@ module TestNetHTTP_version_1_2_methods https://github.com/ruby/ruby/blob/trunk/test/net/http/test_http.rb#L419
   def test_request
     start {|http|
       _test_request__GET http
+      _test_request__accept_encoding http
       _test_request__file http
       # _test_request__range http   # WEBrick does not support Range: header.
       _test_request__HEAD http
@@ -440,6 +441,24 @@ module TestNetHTTP_version_1_2_methods https://github.com/ruby/ruby/blob/trunk/test/net/http/test_http.rb#L441
       end
       assert_equal $test_net_http_data.size, res.body.size
       assert_equal $test_net_http_data, res.body
+
+      assert res.decode_content, 'Bug #7831'
+    }
+  end
+
+  def _test_request__accept_encoding(http)
+    req = Net::HTTP::Get.new('/', 'accept-encoding' => 'deflate')
+    http.request(req) {|res|
+      assert_kind_of Net::HTTPResponse, res
+      assert_kind_of String, res.body
+      unless self.is_a?(TestNetHTTP_v1_2_chunked)
+        assert_not_nil res['content-length']
+        assert_equal $test_net_http_data.size, res['content-length'].to_i
+      end
+      assert_equal $test_net_http_data.size, res.body.size
+      assert_equal $test_net_http_data, res.body
+
+      refute res.decode_content, 'Bug #7831'
     }
   end
 
Index: test/net/http/test_http_request.rb
===================================================================
--- test/net/http/test_http_request.rb	(revision 39231)
+++ test/net/http/test_http_request.rb	(revision 39232)
@@ -53,5 +53,27 @@ class HTTPRequestTest < Test::Unit::Test https://github.com/ruby/ruby/blob/trunk/test/net/http/test_http_request.rb#L53
     assert_equal expected, req.to_hash
   end
 
+  def test_initialize_accept_encoding
+    req1 = Net::HTTP::Get.new '/'
+
+    assert req1.decode_content, 'Bug #7831 - automatically decode content'
+
+    req2 = Net::HTTP::Get.new '/', 'accept-encoding' => 'identity'
+
+    refute req2.decode_content,
+           'Bug #7381 - do not decode content if the user overrides'
+  end
+
+  def test_header_set
+    req = Net::HTTP::Get.new '/'
+
+    assert req.decode_content, 'Bug #7831 - automatically decode content'
+
+    req['accept-encoding'] = 'identity'
+
+    refute req.decode_content,
+           'Bug #7831 - do not decode content if the user overrides'
+  end
+
 end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]