Parent

Class Index [+]

Quicksearch

Rack::ConditionalGet

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-core/tree/master/lib/merb-core/rack/middleware/conditional_get.rb

Public Class Methods

new(app) click to toggle source
    # File lib/rack/conditionalget.rb, line 18
18:     def initialize(app)
19:       @app = app
20:     end

Public Instance Methods

call(env) click to toggle source
    # File lib/rack/conditionalget.rb, line 22
22:     def call(env)
23:       case env['REQUEST_METHOD']
24:       when "GET", "HEAD"
25:         status, headers, body = @app.call(env)
26:         headers = Utils::HeaderHash.new(headers)
27:         if status == 200 && fresh?(env, headers)
28:           status = 304
29:           headers.delete('Content-Type')
30:           headers.delete('Content-Length')
31:           body = []
32:         end
33:         [status, headers, body]
34:       else
35:         @app.call(env)
36:       end
37:     end

Private Instance Methods

etag_matches?(none_match, headers) click to toggle source
    # File lib/rack/conditionalget.rb, line 53
53:     def etag_matches?(none_match, headers)
54:       etag = headers['ETag'] and etag == none_match
55:     end
fresh?(env, headers) click to toggle source
    # File lib/rack/conditionalget.rb, line 41
41:     def fresh?(env, headers)
42:       modified_since = env['HTTP_IF_MODIFIED_SINCE']
43:       none_match     = env['HTTP_IF_NONE_MATCH']
44: 
45:       return false unless modified_since || none_match
46: 
47:       success = true
48:       success &&= modified_since?(to_rfc2822(modified_since), headers) if modified_since
49:       success &&= etag_matches?(none_match, headers) if none_match
50:       success
51:     end
modified_since?(modified_since, headers) click to toggle source
    # File lib/rack/conditionalget.rb, line 57
57:     def modified_since?(modified_since, headers)
58:       last_modified = to_rfc2822(headers['Last-Modified']) and
59:         modified_since and
60:         modified_since >= last_modified
61:     end
to_rfc2822(since) click to toggle source
    # File lib/rack/conditionalget.rb, line 63
63:     def to_rfc2822(since)
64:       Time.rfc2822(since) rescue nil
65:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.