class Rack::Deflater::GzipStream

Body class used for gzip encoded responses.

Constants

BUFFER_LENGTH

Public Class Methods

Initialize the gzip stream. Arguments:

body

Response body to compress with gzip

mtime

The modification time of the body, used to set the modification time in the gzip header.

sync

Whether to flush each gzip chunk as soon as it is ready.

# File lib/rack/deflater.rb, line 92
def initialize(body, mtime, sync)
  @body = body
  @mtime = mtime
  @sync = sync
end

Public Instance Methods

Close the original body if possible.

# File lib/rack/deflater.rb, line 128
def close
  @body.close if @body.respond_to?(:close)
end

Yield gzip compressed strings to the given block.

# File lib/rack/deflater.rb, line 99
def each(&block)
  @writer = block
  gzip = ::Zlib::GzipWriter.new(self)
  gzip.mtime = @mtime if @mtime
  # @body.each is equivalent to @body.gets (slow)
  if @body.is_a? ::File # XXX: Should probably be ::IO
    while part = @body.read(BUFFER_LENGTH)
      gzip.write(part)
      gzip.flush if @sync
    end
  else
    @body.each { |part|
      # Skip empty strings, as they would result in no output,
      # and flushing empty parts would raise Zlib::BufError.
      next if part.empty?
      gzip.write(part)
      gzip.flush if @sync
    }
  end
ensure
  gzip.finish
end

Call the block passed to each with the gzipped data.

# File lib/rack/deflater.rb, line 123
def write(data)
  @writer.call(data)
end