diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | lib/net/http.rb | 29 | ||||
-rw-r--r-- | lib/net/http/generic_request.rb | 12 | ||||
-rw-r--r-- | lib/net/http/request.rb | 7 | ||||
-rw-r--r-- | lib/net/http/response.rb | 147 | ||||
-rw-r--r-- | test/net/http/test_http_request.rb | 57 | ||||
-rw-r--r-- | test/net/http/test_httpresponse.rb | 158 | ||||
-rw-r--r-- | test/open-uri/test_open-uri.rb | 8 |
8 files changed, 387 insertions, 45 deletions
@@ -1,3 +1,17 @@ Fri Jul 20 03:42:54 2012 NARUSE, Yui <[email protected]> * thread_pthread.c: use #ifdef, not #if. @@ -283,6 +283,14 @@ module Net #:nodoc: # See Net::HTTP::Proxy for further details and examples such as proxies that # require a username and password. # # == HTTP Request Classes # # Here is the HTTP request class hierarchy. @@ -602,7 +610,6 @@ module Net #:nodoc: @use_ssl = false @ssl_context = nil @enable_post_connection_check = true - @compression = nil @sspi_enabled = false SSL_IVNAMES.each do |ivname| instance_variable_set ivname, nil @@ -1052,28 +1059,10 @@ module Net #:nodoc: initheader = initheader.merge({ "accept-encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" }) - @compression = true end end request(Get.new(path, initheader)) {|r| - if r.key?("content-encoding") and @compression - @compression = nil # Clear it till next set. - the_body = r.read_body dest, &block - case r["content-encoding"] - when "gzip" - r.body= Zlib::GzipReader.new(StringIO.new(the_body), encoding: "ASCII-8BIT").read - r.delete("content-encoding") - when "deflate" - r.body= Zlib::Inflate.inflate(the_body); - r.delete("content-encoding") - when "identity" - ; # nothing needed - else - ; # Don't do anything dramatic, unless we need to later - end - else - r.read_body dest, &block - end res = r } res @@ -14,6 +14,18 @@ class Net::HTTPGenericRequest raise ArgumentError, "no HTTP request path given" unless path raise ArgumentError, "HTTP request path is empty" if path.empty? @path = path initialize_http_header initheader self['Accept'] ||= '*/*' self['User-Agent'] ||= 'Ruby' @@ -4,7 +4,12 @@ # subclasses: Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Head. # class Net::HTTPRequest < Net::HTTPGenericRequest - # Creates HTTP request object. def initialize(path, initheader = nil) super self.class::METHOD, self.class::REQUEST_HAS_BODY, @@ -222,25 +222,70 @@ class Net::HTTPResponse private - def read_body_0(dest) - if chunked? - read_chunked dest - return - end - clen = content_length() - if clen - @socket.read clen, dest, true # ignore EOF - return end - clen = range_length() - if clen - @socket.read clen, dest - return end - @socket.read_all dest end - def read_chunked(dest) len = nil total = 0 while true @@ -250,7 +295,7 @@ class Net::HTTPResponse len = hexlen.hex break if len == 0 begin - @socket.read len, dest ensure total += len @socket.read 2 # \r\n @@ -266,8 +311,8 @@ class Net::HTTPResponse end def procdest(dest, block) - raise ArgumentError, 'both arg and block given for HTTP method' \ - if dest and block if block Net::ReadAdapter.new(block) else @@ -275,5 +320,71 @@ class Net::HTTPResponse end end end @@ -0,0 +1,57 @@ @@ -4,7 +4,7 @@ require 'stringio' class HTTPResponseTest < Test::Unit::TestCase def test_singleline_header - io = dummy_io(<<EOS.gsub(/\n/, "\r\n")) HTTP/1.1 200 OK Content-Length: 5 Connection: close @@ -17,7 +17,7 @@ EOS end def test_multiline_header - io = dummy_io(<<EOS.gsub(/\n/, "\r\n")) HTTP/1.1 200 OK X-Foo: XXX YYY @@ -32,9 +32,163 @@ EOS assert_equal('XXX YYY', res.header['x-bar']) end private def dummy_io(str) Net::BufferedIO.new(StringIO.new(str)) end end @@ -488,12 +488,12 @@ class TestOpenURI < Test::Unit::TestCase srv.mount_proc("/data2/") {|req, res| res.body = content_gz; res['content-encoding'] = 'gzip'; res.chunked = true } srv.mount_proc("/noce/") {|req, res| res.body = content_gz } open("#{url}/data/") {|f| - assert_equal ['gzip'], f.content_encoding - assert_equal(content_gz, f.read.force_encoding("ascii-8bit")) } open("#{url}/data2/") {|f| - assert_equal ['gzip'], f.content_encoding - assert_equal(content_gz, f.read.force_encoding("ascii-8bit")) } open("#{url}/noce/") {|f| assert_equal [], f.content_encoding |