vendor/rack/lib/rack/deflater.rb in relevance-castronaut-0.5.4 vs vendor/rack/lib/rack/deflater.rb in relevance-castronaut-0.6.0
- old
+ new
@@ -1,31 +1,55 @@
require "zlib"
require "stringio"
+require "time" # for Time.httpdate
module Rack
class Deflater
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
+ headers = Utils::HeaderHash.new(headers)
+ # Skip compressing empty entity body responses and responses with
+ # no-transform set.
+ if Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
+ headers['Cache-Control'].to_s =~ /\bno-transform\b/
+ return [status, headers, body]
+ end
+
request = Request.new(env)
- encoding = Utils.select_best_encoding(%w(gzip deflate identity), request.accept_encoding)
+ encoding = Utils.select_best_encoding(%w(gzip deflate identity),
+ request.accept_encoding)
+ # Set the Vary HTTP header.
+ vary = headers["Vary"].to_s.split(",").map { |v| v.strip }
+ unless vary.include?("*") || vary.include?("Accept-Encoding")
+ headers["Vary"] = vary.push("Accept-Encoding").join(",")
+ end
+
case encoding
when "gzip"
- mtime = headers["Last-Modified"] || Time.now
- [status, headers.merge("Content-Encoding" => "gzip"), self.class.gzip(body, mtime)]
+ mtime = if headers.key?("Last-Modified")
+ Time.httpdate(headers["Last-Modified"])
+ else
+ Time.now
+ end
+ [status,
+ headers.merge("Content-Encoding" => "gzip"),
+ self.class.gzip(body, mtime)]
when "deflate"
- [status, headers.merge("Content-Encoding" => "deflate"), self.class.deflate(body)]
+ [status,
+ headers.merge("Content-Encoding" => "deflate"),
+ self.class.deflate(body)]
when "identity"
[status, headers, body]
when nil
- message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
+ message = ["An acceptable encoding for the requested resource #{request.fullpath} could not be found."]
[406, {"Content-Type" => "text/plain"}, message]
end
end
def self.gzip(body, mtime)