Issue #11058 has been updated by Yui NARUSE.


Almost are ok.
One thing in 0002-lib-net-http-response.rb-Net-HTTPResponse-Inflater.patch, use @inflate.total_in instead of @bytes_read.
After fix that, please commit them by yourself

----------------------------------------
Bug #11058: [PATCH] Net::HTTPResponse#read_body raises TypeError when receiving empty gzipped response body
https://bugs.ruby-lang.org/issues/11058#change-53587

* Author: Kazuki Tsujimoto
* Status: Assigned
* Priority: Normal
* Assignee: Yui NARUSE
* ruby -v: ruby 2.3.0dev (2015-04-11 master 50228) [x86_64-linux]
* Backport: 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
----------------------------------------
Following code raises TypeError.

~~~ruby
require 'net/http'

def dummy_io(str)
  str = str.gsub(/\n/, "\r\n")
  Net::BufferedIO.new(StringIO.new(str))
end

io = dummy_io(<<EOS)
HTTP/1.1 200 OK
Connection: close
Content-Encoding: deflate
Content-Length: 0

EOS

res = Net::HTTPResponse.read_new(io)
res.decode_content = true

res.reading_body io, true do
  res.read_body
end
~~~


There are two problems.

(1) In Net::HTTPResponse#inflater, `e` may be nil and causes TypeError if `inflate_body_io.finish` failed.

~~~ruby
begin
  yield inflate_body_io
ensure
  e = $!
  begin
    inflate_body_io.finish
  rescue
    raise e
  end
end
~~~

(2) Zlib::ZStream#finish raises Zlib::BufError when inflating an empty string, so we should avoid calling #finish in such case.

~~~ruby
require 'zlib'
inflate = Zlib::Inflate.new
inflate.inflate('')
inflate.finish #=> Zlib::BufError: buffer error
~~~


---Files--------------------------------
0001-lib-net-http-response.rb-Net-HTTPResponse-inflater-f.patch (882 Bytes)
0002-lib-net-http-response.rb-Net-HTTPResponse-Inflater.patch (2.78 KB)


-- 
https://bugs.ruby-lang.org/