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
 9 def self.call(request)
10   new(request).generate
11 end
new(request) click to toggle source
   # File lib/rack/cache/key.rb
13 def initialize(request)
14   @request = request
15 end

Public Instance Methods

generate() click to toggle source

Generate a normalized cache key for the request.

   # File lib/rack/cache/key.rb
18 def generate
19   parts = []
20   parts << @request.scheme << "://"
21   parts << @request.host
22 
23   if @request.scheme == "https" && @request.port != 443 ||
24       @request.scheme == "http" && @request.port != 80
25     parts << ":" << @request.port.to_s
26   end
27 
28   parts << @request.script_name
29   parts << @request.path_info
30 
31   if qs = query_string
32     parts << "?"
33     parts << qs
34   end
35 
36   parts.join
37 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
42 def query_string
43   return nil if @request.query_string.nil?
44 
45   @request.query_string.split(/[&;] */n).
46     map { |p| p.split('=', 2).map{ |s| unescape(s) } }.
47     sort.
48     map { |k,v| "#{escape(k)}=#{escape(v)}" }.
49     join('&')
50 end