module Roda::RodaPlugins::Caching::RequestMethods

  1. lib/roda/plugins/caching.rb

Methods

Public Instance

  1. etag
  2. last_modified

Public Instance methods

etag(value, opts=OPTS)

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.

[show source]
    # 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['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
last_modified(time)

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.

[show source]
    # File lib/roda/plugins/caching.rb
 85 def last_modified(time)
 86   return unless time
 87   res = response
 88   e = env
 89   res['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