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
24 def self.call(request)
25   new(request).generate
26 end
new(request) click to toggle source
   # File lib/rack/cache/key.rb
28 def initialize(request)
29   @request = request
30 end

Public Instance Methods

generate() click to toggle source

Generate a normalized cache key for the request.

   # File lib/rack/cache/key.rb
33 def generate
34   parts = []
35   parts << @request.scheme << "://"
36   parts << @request.host
37 
38   if @request.scheme == "https" && @request.port != 443 ||
39       @request.scheme == "http" && @request.port != 80
40     parts << ":" << @request.port.to_s
41   end
42 
43   parts << @request.script_name
44   parts << @request.path_info
45 
46   if qs = query_string
47     parts << "?"
48     parts << qs
49   end
50 
51   parts.join
52 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
57 def query_string
58   return nil if @request.query_string.to_s.empty?
59 
60   parts = @request.query_string.split(/[&;] */n)
61   parts.map! { |p| p.split('=', 2).map!{ |s| unescape(s) } }
62   parts.sort!
63   parts.reject!(&self.class.query_string_ignore)
64   parts.map! { |k,v| "#{escape(k)}=#{escape(v)}" }
65   parts.empty? ? nil : parts.join('&')
66 end