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)