Object
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
# 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
# File lib/rack/conditionalget.rb, line 53 53: def etag_matches?(none_match, headers) 54: etag = headers['ETag'] and etag == none_match 55: end
# 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
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.