Public Instance methods
Set the response entity tag using the ETag header.
The value
argument is an identifier that uniquely identifies the current version of the resource. Options:
:weak |
Use a weak cache validator (a strong cache validator is the default) |
:new_resource |
Whether this etag should match an etag of * (true for POST, false otherwise) |
When the current request includes an If-None-Match header with a matching etag, immediately returns a response with a 304 or 412 status, depending on the request method.
When the current request includes an If-Match header with a etag that doesn’t match, immediately returns a response with a 412 status.
# File lib/roda/plugins/caching.rb 118 def etag(value, opts=OPTS) 119 # Before touching this code, please double check RFC 2616 14.24 and 14.26. 120 weak = opts[:weak] 121 new_resource = opts.fetch(:new_resource){post?} 122 123 res = response 124 e = env 125 res[RodaResponseHeaders::ETAG] = etag = "#{'W/' if weak}\"#{value}\"" 126 status = res.status 127 128 if (!status || (status >= 200 && status < 300) || status == 304) 129 if etag_matches?(e['HTTP_IF_NONE_MATCH'], etag, new_resource) 130 res.status = (request_method =~ /\AGET|HEAD|OPTIONS|TRACE\z/i ? 304 : 412) 131 halt 132 end 133 134 if ifm = e['HTTP_IF_MATCH'] 135 unless etag_matches?(ifm, etag, new_resource) 136 res.status = 412 137 halt 138 end 139 end 140 end 141 end
Set the last modified time of the resource using the Last-Modified header. The time
argument should be a Time instance.
If the current request includes an If-Modified-Since header that is equal or later than the time specified, immediately returns a response with a 304 status.
If the current request includes an If-Unmodified-Since header that is before than the time specified, immediately returns a response with a 412 status.
# File lib/roda/plugins/caching.rb 85 def last_modified(time) 86 return unless time 87 res = response 88 e = env 89 res[RodaResponseHeaders::LAST_MODIFIED] = time.httpdate 90 return if e['HTTP_IF_NONE_MATCH'] 91 status = res.status 92 93 if (!status || status == 200) && (ims = time_from_header(e['HTTP_IF_MODIFIED_SINCE'])) && ims >= time.to_i 94 res.status = 304 95 halt 96 end 97 98 if (!status || (status >= 200 && status < 300) || status == 412) && (ius = time_from_header(e['HTTP_IF_UNMODIFIED_SINCE'])) && ius < time.to_i 99 res.status = 412 100 halt 101 end 102 end