summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-07-19 22:43:38 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-07-19 22:43:38 +0000
commitb1a0509b5465ce77f52e0384159237889a8d60ec ()
treeea22ccb90a2367364e0c740f15ad571558b025f4
parentef19dcf96dd2e84c4fe0a46888a5afd0cd457f80 (diff)
* lib/net/http/response.rb: Automatically inflate gzip and
deflate-encoded response bodies. [Feature #6942] * lib/net/http/generic_request.rb: Automatically accept gzip and deflate content-encoding for requests. [Feature #6494] * lib/net/http/request.rb: Updated documentation for #6494. * lib/net/http.rb: Updated documentation for #6492 and #6494, removed Content-Encoding handling now present in Net::HTTPResponse. * test/net/http/test_httpresponse.rb: Tests for #6492 * test/net/http/test_http_request.rb: Tests for #6494 * test/open-uri/test_open-uri.rb (test_content_encoding): Updated test for automatic content-encoding handling. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36473 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog14
-rw-r--r--lib/net/http.rb29
-rw-r--r--lib/net/http/generic_request.rb12
-rw-r--r--lib/net/http/request.rb7
-rw-r--r--lib/net/http/response.rb147
-rw-r--r--test/net/http/test_http_request.rb57
-rw-r--r--test/net/http/test_httpresponse.rb158
-rw-r--r--test/open-uri/test_open-uri.rb8
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