Bug #8182 » net.http.bug8182.patch
lib/net/http/header.rb (working copy) | ||
---|---|---|
# Returns an Integer object which represents the HTTP Content-Length:
|
||
# header field, or +nil+ if that field was not provided.
|
||
#
|
||
# For a response that has a gzip or deflate Content-Encoding the
|
||
# Content-Length will be updated with the decoded length after the body has
|
||
# been read.
|
||
#
|
||
def content_length
|
||
return nil unless key?('Content-Length')
|
||
len = self['Content-Length'].slice(/\d+/) or
|
lib/net/http/response.rb (working copy) | ||
---|---|---|
# end
|
||
# }
|
||
#
|
||
# If the response has a gzip or deflate Content-Encoding the Content-Length
|
||
# will be updated with the decoded length after the body has been read.
|
||
#
|
||
def read_body(dest = nil, &block)
|
||
if @read
|
||
raise IOError, "#{self.class}\#read_body called twice" if dest or block
|
||
... | ... | |
# p res.body.object_id # 538149362
|
||
# }
|
||
#
|
||
# If the response has a gzip or deflate Content-Encoding the Content-Length
|
||
# will be updated with the decoded length after the body has been read.
|
||
#
|
||
def body
|
||
read_body()
|
||
end
|
||
... | ... | |
yield inflate_body_io
|
||
ensure
|
||
inflate_body_io.finish
|
||
self['content-length'] = inflate_body_io.decoded_length
|
||
end
|
||
when 'none', 'identity' then
|
||
self.delete 'content-encoding'
|
||
... | ... | |
class Inflater # :nodoc:
|
||
##
|
||
# Length of the decoded response body in bytes
|
||
attr_reader :decoded_length
|
||
##
|
||
# Creates a new Inflater wrapping +socket+
|
||
def initialize socket
|
||
@socket = socket
|
||
@decoded_length = 0
|
||
# zlib with automatic gzip detection
|
||
@inflate = Zlib::Inflate.new(32 + Zlib::MAX_WBITS)
|
||
end
|
||
... | ... | |
block = proc do |compressed_chunk|
|
||
@inflate.inflate(compressed_chunk) do |chunk|
|
||
dest << chunk
|
||
@decoded_length += chunk.bytesize
|
||
end
|
||
end
|
||
test/net/http/test_httpresponse.rb (working copy) | ||
---|---|---|
if Net::HTTP::HAVE_ZLIB
|
||
assert_equal nil, res['content-encoding']
|
||
assert_equal '5', res['content-length'], "Bug #8182"
|
||
assert_equal 'hello', body
|
||
else
|
||
assert_equal 'deflate', res['content-encoding']
|
||
assert_equal '13', res['content-length'], "Bug #8182"
|
||
assert_equal "x\x9C\xCBH\xCD\xC9\xC9\a\x00\x06,\x02\x15", body
|
||
end
|
||
end
|