class Rack::Deflater::GzipStream

Body class used for gzip encoded responses.

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 85
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 114
def close
  @body.close if @body.respond_to?(:close)
end

Yield gzip compressed strings to the given block.

# File lib/rack/deflater.rb, line 92
def each(&block)
  @writer = block
  gzip = ::Zlib::GzipWriter.new(self)
  gzip.mtime = @mtime if @mtime
  @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
  }
ensure
  gzip.close
end

Call the block passed to each with the the gzipped data.

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