Protocol::HTTPSourceProtocolHTTPBodyInflate

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