class HttpDecoders::GZip

Constants

MAGIC_STRING

Public Class Methods

encoding_names() click to toggle source
# File lib/http_decoders.rb, line 221
def self.encoding_names
  %w(gzip compressed)
end
new() click to toggle source
Calls superclass method HttpDecoders::Base::new
# File lib/http_decoders.rb, line 225
def initialize
  super
  @buffer = nil
end

Public Instance Methods

decompress(compressed) click to toggle source
# File lib/http_decoders.rb, line 230
def decompress(compressed)
  compressed
    .force_encoding(Encoding::ASCII_8BIT)
    .each_line(MAGIC_STRING)
    .map { |chunk| decompress_chunk(chunk) }
    .join('')
end
finalize() click to toggle source
# File lib/http_decoders.rb, line 238
def finalize
  if @zstream
    if !@zstream.finished?
      r = @zstream.finish
    end
    @zstream.close
    r
  else
    nil
  end
rescue Zlib::Error
  raise DecoderError
end

Private Instance Methods

decompress_buffer() click to toggle source
# File lib/http_decoders.rb, line 279
def decompress_buffer
  next_stream = find_stream(@buffer.join) if @buffer
  return unless next_stream

  @buffer = nil
  decompressed = finalize.to_s
  reset
  decompressed + decompress(next_stream)
end
decompress_chunk(compressed) click to toggle source
# File lib/http_decoders.rb, line 254
def decompress_chunk(compressed)
  @header ||= GZipHeader.new
  if !@header.finished?
    compressed = @header.extract_stream(compressed)
  end

  if @buffer
    @buffer << compressed
    decompress_buffer
  else
    @zstream ||= Zlib::Inflate.new(-Zlib::MAX_WBITS)
    decompressed = @zstream.inflate(compressed)

    # Gzip tailer with CRC32 and length is included after deflate stream.
    # Buffer input including magic byte
    if @header.finished? && @zstream.finished?
      @buffer = []
      @buffer << MAGIC_STRING if compressed.end_with?(MAGIC_STRING)
    end
    decompressed.to_s
  end
rescue Zlib::Error
  raise DecoderError
end
find_stream(decompressed) click to toggle source
# File lib/http_decoders.rb, line 289
def find_stream(decompressed)
  index = decompressed.force_encoding(Encoding::ASCII_8BIT).index(MAGIC_STRING)
  if index
    decompressed[index..-1]
  else
    nil
  end
end
reset() click to toggle source
# File lib/http_decoders.rb, line 298
def reset
  @header = nil
  @zstream = nil
end