class Rack::Cache::Key

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 9
def self.call(request)
  new(request).generate
end
new(request) click to toggle source
# File lib/rack/cache/key.rb, line 13
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 18
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 42
def query_string
  return nil if @request.query_string.nil?

  @request.query_string.split(/[&;] */n).
    map { |p| p.split('=', 2).map{ |s| unescape(s) } }.
    sort.
    map { |k,v| "#{escape(k)}=#{escape(v)}" }.
    join('&')
end