module Roda::RodaPlugins::Caching::RequestMethods
def etag(value, opts=OPTS)
When the current request includes an If-Match header with a
depending on the request method.
matching etag, immediately returns a response with a 304 or 412 status,
When the current request includes an If-None-Match header with a
:new_resource :: Whether this etag should match an etag of * (true for POST, false otherwise)
:weak :: Use a weak cache validator (a strong cache validator is the default)
Options:
identifies the current version of the resource.
The +value+ argument is an identifier that uniquely
Set the response entity tag using the ETag header.
def etag(value, opts=OPTS) # Before touching this code, please double check RFC 2616 14.24 and 14.26. weak = opts[:weak] new_resource = opts.fetch(:new_resource){post?} res = response e = env res[RodaResponseHeaders::ETAG] = etag = "#{'W/' if weak}\"#{value}\"" status = res.status if (!status || (status >= 200 && status < 300) || status == 304) if etag_matches?(e['HTTP_IF_NONE_MATCH'], etag, new_resource) res.status = (request_method =~ /\AGET|HEAD|OPTIONS|TRACE\z/i ? 304 : 412) halt end if ifm = e['HTTP_IF_MATCH'] unless etag_matches?(ifm, etag, new_resource) res.status = 412 halt end end end end