Class: Rack::ConditionalGet
- Inherits:
-
Object
- Object
- Rack::ConditionalGet
- Defined in:
- lib/rack/conditional_get.rb
Overview
Middleware that enables conditional GET using If-None-Match and If-Modified-Since. The application should set either or both of the Last-Modified or Etag response headers according to RFC 2616. When either of the conditions is met, the response body is set to be zero length and the response status is set to 304 Not Modified.
Applications that defer response body generation until the body’s each message is received will avoid response body generation completely when a conditional GET matches.
Adapted from Michael Klishin’s Merb implementation: github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app) ⇒ ConditionalGet
constructor
A new instance of ConditionalGet.
Constructor Details
#initialize(app) ⇒ ConditionalGet
Returns a new instance of ConditionalGet.
18 19 20 |
# File 'lib/rack/conditional_get.rb', line 18 def initialize(app) @app = app end |
Instance Method Details
#call(env) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/rack/conditional_get.rb', line 22 def call(env) case env[REQUEST_METHOD] when "GET", "HEAD" status, headers, body = @app.call(env) headers = Utils::HeaderHash.new(headers) if status == 200 && fresh?(env, headers) status = 304 headers.delete(CONTENT_TYPE) headers.delete(CONTENT_LENGTH) original_body = body body = Rack::BodyProxy.new([]) do original_body.close if original_body.respond_to?(:close) end end [status, headers, body] else @app.call(env) end end |