Issue #6492 has been updated by naruse (Yui NARUSE).


I agree with the concept of the patch, but

> +  ensure
> +    @socket.finish if Inflater === @socket

When @socket is Socket-like object, the object should behave like a socket.
Inflater#finish should be Inflater#shutdown or Inflater#close and this if-clause is not needed.

> -  def read_chunked(dest)                                                                           
> +  def read_chunked(dest, inflater)                                                                 
>      len = nil                                                                                      
>      total = 0                                                                                      
>      while true                                                                                     
> @@ -303,7 +331,7 @@ class Net::HTTPResponse                                                         
>        len = hexlen.hex                                                                             
>        break if len == 0                                                                            
>        begin                                                                                        
> -        @socket.read len, dest                                                                     
> +        inflater.read len, dest                                                                    
>        ensure                                                                                       
>          total += len                                                                               
>          @socket.read 2   # \r\n  def

this variable inflater is confusing with the inflater method.

>+    def read clen, dest, ignore_eof = false                                                        
> +      temp_dest = ''                                                                               
> +                                                                                                   
> +      @socket.read clen, temp_dest, ignore_eof                                                     
> +                                                                                                   
> +      dest << @inflate.inflate(temp_dest)                                                          
> +    end 

This read method return a string whose length is not clen, this is wrong.
Other IO-like object for example Zlib::GzipReader returns a string whose length is clen.
So Inflater should have a internal buffer and return the string whose length is just clen.
----------------------------------------
Feature #6492: Inflate all HTTP Content-Encoding: deflate, gzip, x-gzip responses by default
https://bugs.ruby-lang.org/issues/6492#change-26812

Author: drbrain (Eric Hodel)
Status: Open
Priority: Normal
Assignee: 
Category: lib
Target version: 2.0.0


=begin
This patch moves the compression-handling code from Net::HTTP#get to Net::HTTPResponse to allow decompression to occur by default on any response body.  (A future patch will set the Accept-Encoding on all requests that allow response bodies by default.)

Instead of having separate decompression code for deflate and gzip-encoded responses, (({Zlib::Inflate.new(32 + Zlib::MAX_WBITS)})) is used which automatically detects and inflated gzip-wrapped streams which allows for simpler processing of gzip bodies (no need to create a StringIO).
=end



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