class Rack::Cache::Key

Attributes

query_string_ignore[RW]

Public Class Methods

call(request) click to toggle source

Implement .call, since it seems like the “Rack-y” thing to do. Plus, it opens the door for cache key generators to just be blocks.

# File lib/rack/cache/key.rb, line 24
def self.call(request)
  new(request).generate
end
new(request) click to toggle source
# File lib/rack/cache/key.rb, line 28
def initialize(request)
  @request = request
end

Public Instance Methods

generate() click to toggle source

Generate a normalized cache key for the request.

# File lib/rack/cache/key.rb, line 33
def generate
  parts = []
  parts << @request.scheme << "://"
  parts << @request.host

  if @request.scheme == "https" && @request.port != 443 ||
      @request.scheme == "http" && @request.port != 80
    parts << ":" << @request.port.to_s
  end

  parts << @request.script_name
  parts << @request.path_info

  if qs = query_string
    parts << "?"
    parts << qs
  end

  parts.join
end

Private Instance Methods

query_string() click to toggle source

Build a normalized query string by alphabetizing all keys/values and applying consistent escaping.

# File lib/rack/cache/key.rb, line 57
def query_string
  return nil if @request.query_string.to_s.empty?

  parts = @request.query_string.split(/[&;] */n)
  parts.map! { |p| p.split('=', 2).map!{ |s| unescape(s) } }
  parts.sort!
  parts.reject!(&self.class.query_string_ignore)
  parts.map! { |k,v| "#{escape(k)}=#{escape(v)}" }
  parts.empty? ? nil : parts.join('&')
end