module Grape::CacheControl

Constants

ALL_DIRECTIVES
CACHE_CONTROL
EXPIRES
SETTABLE_DIRECTIVES
TRUE
TRUTHY_DIRECTIVES
VERSION

Public Class Methods

cache_control(request, *values) click to toggle source
# File lib/grape/cache_control.rb, line 22
def cache_control(request, *values)
  cc_directives = {}

  (cache_control_segments(request.header(CACHE_CONTROL)) | cache_control_values(*values)).each do |segment|
    directive, argument = segment.split('=', 2)
    cc_directives[directive.tr('-', '_').to_sym] = argument || true
  end

  if !cc_directives.empty?
    cc_header = []
    cc_directives.delete(:public) if cc_directives.key? :private
    cc_directives.delete(:private) if cc_directives.key? :public
    cc_directives.each do |k, v|
      if SETTABLE_DIRECTIVES.include?(k)
        cc_header << "#{Grape::CacheControl.const_get(k.upcase)}=#{v.to_i}"
      elsif TRUTHY_DIRECTIVES.include?(k) && v == TRUE
        cc_header << Grape::CacheControl.const_get(k.upcase)
      end
    end
    request.header(CACHE_CONTROL, cc_header.join(', '))
  end
end
expires(request, amount, *values) click to toggle source
# File lib/grape/cache_control.rb, line 45
def expires(request, amount, *values)
  if amount.is_a? Integer
    time    = Time.now + amount.to_i
    max_age = amount
  else
    time    = amount
    max_age = time - Time.now
  end

  values << { max_age: max_age }
  request.header(EXPIRES, time.httpdate)
  cache_control(request, *values)
end

Private Class Methods

cache_control_segments(header = nil) click to toggle source
# File lib/grape/cache_control.rb, line 76
def cache_control_segments(header = nil)
  segments = []
  segments.concat header.delete(' ').split(',') unless header.nil?
  segments
end
cache_control_values(*values) click to toggle source
# File lib/grape/cache_control.rb, line 61
def cache_control_values(*values)
  cache_control_values = []
  values.each do |value|
    if value.is_a? Hash
      cache_control_values.concat value.map { |k, v|
        argument = v.is_a?(Time) ? v - Time.now : v
        "#{Grape::CacheControl.const_get(k.upcase)}=#{argument}"
      }
    elsif value.is_a? Symbol
      cache_control_values << "#{value}=#{TRUE}"
    end
  end
  cache_control_values
end