class Inflate
A body which decompresses the contents using the DEFLATE or GZIP algorithm.
Definitions
def self.for(body, window_size = GZIP)
Create a new body which decompresses the given body using the GZIP algorithm by default.
Signature
-
parameter
body
Readable
the body to wrap.
-
parameter
window_size
Integer
the window size to use for decompression.
Implementation
def self.for(body, window_size = GZIP)
self.new(body, Zlib::Inflate.new(window_size))
end
def read
Read from the underlying stream and inflate it.
Signature
-
returns
String | Nil
the inflated data, or nil if the stream is finished.
Implementation
def read
if stream = @stream
# Read from the underlying stream and inflate it:
while chunk = super
@input_length += chunk.bytesize
# It's possible this triggers the stream to finish.
chunk = stream.inflate(chunk)
break unless chunk&.empty?
end
if chunk
@output_length += chunk.bytesize
elsif !stream.closed?
chunk = stream.finish
@output_length += chunk.bytesize
end
# If the stream is finished, we need to close it and potentially return nil:
if stream.finished?
@stream = nil
stream.close
while super
# There is data left in the stream, so we need to keep reading until it's all consumed.
end
if chunk.empty?
return nil
end
end
return chunk
end
end