Class: Rack::ConditionalGet

Inherits:
Object
  • Object
show all
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

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