Class: Rack::Deflater
- Defined in:
- lib/gems/rack-0.4.0/lib/rack/deflater.rb
Constant Summary collapse
- DEFLATE_ARGS =
[ Zlib::DEFAULT_COMPRESSION, # drop the zlib header which causes both Safari and IE to choke -Zlib::MAX_WBITS, Zlib::DEF_MEM_LEVEL, Zlib::DEFAULT_STRATEGY ]
Class Method Summary collapse
-
.deflate(body) ⇒ Object
Loosely based on Mongrel’s Deflate handler.
- .gzip(body, mtime) ⇒ Object
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app) ⇒ Deflater
constructor
A new instance of Deflater.
Constructor Details
#initialize(app) ⇒ Deflater
Returns a new instance of Deflater.
7 8 9 |
# File 'lib/gems/rack-0.4.0/lib/rack/deflater.rb', line 7 def initialize(app) @app = app end |
Class Method Details
.deflate(body) ⇒ Object
Loosely based on Mongrel’s Deflate handler
53 54 55 56 57 58 59 60 |
# File 'lib/gems/rack-0.4.0/lib/rack/deflater.rb', line 53 def self.deflate(body) deflater = Zlib::Deflate.new(*DEFLATE_ARGS) # TODO: Add streaming body.each { |part| deflater << part } return deflater.finish end |
.gzip(body, mtime) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/gems/rack-0.4.0/lib/rack/deflater.rb', line 32 def self.gzip(body, mtime) io = StringIO.new gzip = Zlib::GzipWriter.new(io) gzip.mtime = mtime # TODO: Add streaming body.each { |part| gzip << part } gzip.close return io.string end |
Instance Method Details
#call(env) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/gems/rack-0.4.0/lib/rack/deflater.rb', line 11 def call(env) status, headers, body = @app.call(env) request = Request.new(env) encoding = Utils.select_best_encoding(%w(gzip deflate identity), request.accept_encoding) case encoding when "gzip" mtime = headers["Last-Modified"] || Time.now [status, headers.merge("Content-Encoding" => "gzip"), self.class.gzip(body, mtime)] when "deflate" [status, headers.merge("Content-Encoding" => "deflate"), self.class.deflate(body)] when "identity" [status, headers, body] when nil = "An acceptable encoding for the requested resource #{request.fullpath} could not be found." [406, {"Content-Type" => "text/plain"}, ] end end |