Module Merb::ConditionalGetMixin
In: merb-core/lib/merb-core/controller/mixins/conditional_get.rb

Provides conditional get support in Merb core. Conditional get support is intentionally simple and does not do fancy stuff like making ETag value from Ruby objects for you.

The most interesting method for end user is +request_fresh?+ that is used after setting of last modification time or ETag:

Example

def show

  self.etag = Digest::SHA1.hexdigest(calculate_cache_key(params))

  if request_fresh?
    self.status = 304
    return ''
  else
    @product = Product.get(params[:id])
    display @product
  end

end

Methods

Public Instance methods

Returns

<String>:Value of ETag response header or nil if it‘s not set.

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 43
43:   def etag
44:     headers[Merb::Const::ETAG]
45:   end

Sets ETag response header by calling to_s on the argument.

Parameters

tag<~to_s>:value of ETag header enclosed in double quotes as required by the RFC

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 34
34:   def etag=(tag)
35:     headers[Merb::Const::ETAG] = %("#{tag}")
36:   end

Returns

<Boolean>:: true if ETag response header equals If-None-Match request header, false otherwise

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 53
53:   def etag_matches?(tag = self.etag)
54:     tag == self.request.if_none_match
55:   end

Returns

<String>:Value of Last-Modified response header or nil if it‘s not set.

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 76
76:   def last_modified
77:     last_mod = headers[Merb::Const::LAST_MODIFIED]
78:     Time.rfc2822(last_mod) if last_mod
79:   end

Sets Last-Modified response header.

Parameters

tag<Time>:: resource modification timestamp converted into format required by the RFC

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 65
65:   def last_modified=(time)
66:     time = time.to_time if time.is_a?(DateTime)
67:     # time.utc.strftime("%a, %d %b %Y %X") if we could rely on locale being American
68:     headers[Merb::Const::LAST_MODIFIED] = time.httpdate
69:   end

Returns

<Boolean>:: true if Last-Modified response header is < than If-Modified-Since request header value, false otherwise.

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 87
87:   def not_modified?(time = self.last_modified)
88:     request.if_modified_since && time && time <= request.if_modified_since
89:   end

Returns

<Boolean>:: true if either ETag matches or entity is not modified, so request is fresh; false otherwise

:api: public

[Source]

    # File merb-core/lib/merb-core/controller/mixins/conditional_get.rb, line 97
97:   def request_fresh?
98:     etag_matches?(self.etag) || not_modified?(self.last_modified)
99:   end

[Validate]