Class Rack::Cache::Context
In: lib/rack/cache/context.rb
Parent: Object

Implements Rack‘s middleware interface and provides the context for all cache logic, including the core logic engine.

Methods

call   call!   entitystore   metastore   new  

Included Modules

Rack::Cache::Options

Attributes

backend  [R]  The Rack application object immediately downstream.
trace  [R]  Array of trace Symbols

Public Class methods

[Source]

    # File lib/rack/cache/context.rb, line 18
18:     def initialize(backend, options={})
19:       @backend = backend
20:       @trace = []
21:       @env = nil
22: 
23:       initialize_options options
24:       yield self if block_given?
25: 
26:       @private_header_keys =
27:         private_headers.map { |name| "HTTP_#{name.upcase.tr('-', '_')}" }
28:     end

Public Instance methods

The Rack call interface. The receiver acts as a prototype and runs each request in a dup object unless the +rack.run_once+ variable is set in the environment.

[Source]

    # File lib/rack/cache/context.rb, line 47
47:     def call(env)
48:       if env['rack.run_once']
49:         call! env
50:       else
51:         clone.call! env
52:       end
53:     end

The real Rack call interface. The caching logic is performed within the context of the receiver.

[Source]

    # File lib/rack/cache/context.rb, line 57
57:     def call!(env)
58:       @trace = []
59:       @default_options.each { |k,v| env[k] ||= v }
60:       @env = env
61:       @request = Request.new(@env.dup.freeze)
62: 
63:       response =
64:         if @request.get? || @request.head?
65:           if !@env['HTTP_EXPECT'] && !@env['rack-cache.force-pass']
66:             lookup
67:           else
68:             pass
69:           end
70:         else
71:           invalidate
72:         end
73: 
74:       # log trace and set X-Rack-Cache tracing header
75:       trace = @trace.join(', ')
76:       response.headers['X-Rack-Cache'] = trace
77: 
78:       # write log message to rack.errors
79:       if verbose?
80:         message = "cache: [%s %s] %s\n" %
81:           [@request.request_method, @request.fullpath, trace]
82:         @env['rack.errors'].write(message)
83:       end
84: 
85:       # tidy up response a bit
86:       if (@request.get? || @request.head?) && not_modified?(response)
87:         response.not_modified!
88:       end
89: 
90:       if @request.head?
91:         response.body.close if response.body.respond_to?(:close)
92:         response.body = []
93:       end
94:       response.to_a
95:     end

The configured EntityStore instance. Changing the rack-cache.entitystore value effects the result of this method immediately.

[Source]

    # File lib/rack/cache/context.rb, line 39
39:     def entitystore
40:       uri = options['rack-cache.entitystore']
41:       storage.resolve_entitystore_uri(uri)
42:     end

The configured MetaStore instance. Changing the rack-cache.metastore value effects the result of this method immediately.

[Source]

    # File lib/rack/cache/context.rb, line 32
32:     def metastore
33:       uri = options['rack-cache.metastore']
34:       storage.resolve_metastore_uri(uri)
35:     end

[Validate]