rack-cache 1.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d540010c6bce635d24b70fe8a0484d901d76fd1d
4
+ data.tar.gz: 5e114ab9a12b2465ddcd2852b5e68a7901e1774e
5
+ SHA512:
6
+ metadata.gz: d85a27db86e5ce6980ff0e7287041f17a21f58a7be044f8614caab4470340f566a483fdb6ad9152d75452e0a705af654b755c7c139d31b1c6a5e3f046e1d9692
7
+ data.tar.gz: b481ec44add4cd159aa65750c1477dd4d8190b84154d9eacae03b10e529af9a8791a1cc15741ae78e45787082c82dd4160721e37263bdd0ddc0cda426f88ff46
File without changes
data/README.md ADDED
@@ -0,0 +1,95 @@
1
+ Rack::Cache
2
+ ===========
3
+
4
+ Rack::Cache is suitable as a quick drop-in component to enable HTTP caching for
5
+ Rack-based applications that produce freshness (Expires, Cache-Control) and/or
6
+ validation (Last-Modified, ETag) information:
7
+
8
+ * Standards-based (RFC 2616)
9
+ * Freshness/expiration based caching
10
+ * Validation (If-Modified-Since / If-None-Match)
11
+ * Vary support
12
+ * Cache-Control: public, private, max-age, s-maxage, must-revalidate,
13
+ and proxy-revalidate.
14
+ * Portable: 100% Ruby / works with any Rack-enabled framework
15
+ * Disk, memcached, and heap memory storage backends
16
+
17
+ For more information about Rack::Cache features and usage, see:
18
+
19
+ http://rtomayko.github.com/rack-cache/
20
+
21
+ Rack::Cache is not overly optimized for performance. The main goal of the
22
+ project is to provide a portable, easy-to-configure, and standards-based
23
+ caching solution for small to medium sized deployments. More sophisticated /
24
+ high-performance caching systems (e.g., Varnish, Squid, httpd/mod-cache) may be
25
+ more appropriate for large deployments with significant throughput requirements.
26
+
27
+ Installation
28
+ ------------
29
+
30
+ gem install rack-cache
31
+
32
+ Basic Usage
33
+ -----------
34
+
35
+ `Rack::Cache` is implemented as a piece of Rack middleware and can be used with
36
+ any Rack-based application. If your application includes a rackup (`.ru`) file
37
+ or uses Rack::Builder to construct the application pipeline, simply require
38
+ and use as follows:
39
+
40
+ ```Ruby
41
+ require 'rack/cache'
42
+
43
+ use Rack::Cache,
44
+ :metastore => 'file:/var/cache/rack/meta',
45
+ :entitystore => 'file:/var/cache/rack/body',
46
+ :verbose => true
47
+
48
+ run app
49
+ ```
50
+
51
+ Assuming you've designed your backend application to take advantage of HTTP's
52
+ caching features, no further code or configuration is required for basic
53
+ caching.
54
+
55
+ Using with Rails
56
+ ----------------
57
+
58
+ Add this to your `config/environment.rb`:
59
+
60
+ ```Ruby
61
+ config.middleware.use Rack::Cache,
62
+ :verbose => true,
63
+ :metastore => 'file:/var/cache/rack/meta',
64
+ :entitystore => 'file:/var/cache/rack/body'
65
+ ```
66
+
67
+ You should now see `Rack::Cache` listed in the middleware pipeline:
68
+
69
+ rake middleware
70
+
71
+ See the following for more information:
72
+
73
+ http://snippets.aktagon.com/snippets/302
74
+
75
+ Using with Dalli
76
+ ----------------
77
+
78
+ Dalli is a high performance memcached client for Ruby.
79
+ More information at: https://github.com/mperham/dalli
80
+
81
+ ```Ruby
82
+ require 'dalli'
83
+ require 'rack/cache'
84
+
85
+ use Rack::Cache,
86
+ :verbose => true,
87
+ :metastore => "memcached://localhost:11211/meta",
88
+ :entitystore => "memcached://localhost:11211/body"
89
+
90
+ run app
91
+ ```
92
+
93
+ License: MIT<br/>
94
+ [![Build Status](https://travis-ci.org/rtomayko/rack-cache.png)](https://travis-ci.org/rtomayko/rack-cache)
95
+
@@ -125,6 +125,20 @@ module Rack
125
125
  end
126
126
  alias_method :s_maxage, :shared_max_age
127
127
 
128
+ # If a response includes a r-maxage directive, then for a reverse cache
129
+ # (but not for a private or proxy cache), the maximum age specified by
130
+ # this directive overrides the maximum age specified by either the max-age
131
+ # directive, the s-maxage directive, or the Expires header. The r-maxage
132
+ # directive also implies the semantics of the proxy-revalidate directive.
133
+ # i.e., that the reverse cache must not use the entry after it becomes
134
+ # stale to respond to a subsequent request without first revalidating it
135
+ # with the origin server. The r-maxage directive is always ignored by
136
+ # private and proxy caches.
137
+ def reverse_max_age
138
+ self['r-maxage'].to_i if key?('r-maxage')
139
+ end
140
+ alias_method :r_maxage, :reverse_max_age
141
+
128
142
  # Because a cache MAY be configured to ignore a server's specified
129
143
  # expiration time, and because a client request MAY include a max-
130
144
  # stale directive (which has a similar effect), the protocol also
@@ -45,7 +45,7 @@ module Rack::Cache
45
45
  # each request in a dup object unless the +rack.run_once+ variable is
46
46
  # set in the environment.
47
47
  def call(env)
48
- if env['rack.run_once']
48
+ if env['rack.run_once'] && !env['rack.multithread']
49
49
  call! env
50
50
  else
51
51
  clone.call! env
@@ -79,7 +79,7 @@ module Rack::Cache
79
79
  if verbose?
80
80
  message = "cache: [%s %s] %s\n" %
81
81
  [@request.request_method, @request.fullpath, trace]
82
- @env['rack.errors'].write(message)
82
+ log_info(message)
83
83
  end
84
84
 
85
85
  # tidy up response a bit
@@ -280,7 +280,20 @@ module Rack::Cache
280
280
  end
281
281
 
282
282
  def log_error(exception)
283
- @env['rack.errors'].write("cache error: #{exception.message}\n#{exception.backtrace.join("\n")}\n")
283
+ message = "cache error: #{exception.message}\n#{exception.backtrace.join("\n")}\n"
284
+ log(:error, message)
285
+ end
286
+
287
+ def log_info(message)
288
+ log(:info, message)
289
+ end
290
+
291
+ def log(level, message)
292
+ if @env['rack.logger']
293
+ @env['rack.logger'].send(level, message)
294
+ else
295
+ @env['rack.errors'].write(message)
296
+ end
284
297
  end
285
298
  end
286
299
  end
@@ -64,7 +64,7 @@ module Rack::Cache
64
64
  end
65
65
  response.headers['X-Content-Digest'] = digest
66
66
  response.headers['Content-Length'] = size.to_s unless response.headers['Transfer-Encoding']
67
- response.body = entity_store.open(digest)
67
+ response.body = entity_store.open(digest) || response.body
68
68
  end
69
69
 
70
70
  # read existing cache entries, remove non-varying, and add this one to
@@ -95,14 +95,12 @@ module Rack::Cache
95
95
  # Default: ['Authorization', 'Cookie']
96
96
  option_accessor :private_headers
97
97
 
98
- # Specifies whether the client can force a cache reload by including a
99
- # Cache-Control "no-cache" directive in the request. This is enabled by
100
- # default for compliance with RFC 2616.
98
+ # Specifies whether a client can force cache reload by including a
99
+ # Cache-Control "no-cache" directive in the request. Disabled by default.
101
100
  option_accessor :allow_reload
102
101
 
103
- # Specifies whether the client can force a cache revalidate by including
104
- # a Cache-Control "max-age=0" directive in the request. This is enabled by
105
- # default for compliance with RFC 2616.
102
+ # Specifies whether a client can force cache revalidate by including a
103
+ # Cache-Control "max-age=0" directive in the request. Disabled by default.
106
104
  option_accessor :allow_revalidate
107
105
 
108
106
  # Specifies whether the underlying entity store's native expiration should
@@ -151,13 +151,14 @@ module Rack::Cache
151
151
 
152
152
  # The number of seconds after the time specified in the response's Date
153
153
  # header when the the response should no longer be considered fresh. First
154
- # check for a s-maxage directive, then a max-age directive, and then fall
155
- # back on an expires header; return nil when no maximum age can be
156
- # established.
154
+ # check for a r-maxage directive, then a s-maxage directive, then a max-age
155
+ # directive, and then fall back on an expires header; return nil when no
156
+ # maximum age can be established.
157
157
  def max_age
158
- cache_control.shared_max_age ||
159
- cache_control.max_age ||
160
- (expires && (expires - date))
158
+ cache_control.reverse_max_age ||
159
+ cache_control.shared_max_age ||
160
+ cache_control.max_age ||
161
+ (expires && (expires - date))
161
162
  end
162
163
 
163
164
  # The value of the Expires header as a Time object.
@@ -177,6 +178,12 @@ module Rack::Cache
177
178
  self.cache_control = cache_control.merge('s-maxage' => value.to_s)
178
179
  end
179
180
 
181
+ # Like #shared_max_age= but sets the r-maxage directive, which applies only
182
+ # to reverse caches.
183
+ def reverse_max_age=(value)
184
+ self.cache_control = cache_control.merge('r-maxage' => value.to_s)
185
+ end
186
+
180
187
  # The response's time-to-live in seconds, or nil when no freshness
181
188
  # information is present in the response. When the responses #ttl
182
189
  # is <= 0, the response may not be served from cache without first
metadata CHANGED
@@ -1,60 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.2'
5
- prerelease:
4
+ version: 1.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ryan Tomayko
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-03-05 00:00:00.000000000 Z
11
+ date: 2015-10-06 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
16
- requirement: &70248834703480 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0.4'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70248834703480
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.4'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: bacon
27
- requirement: &70248834703100 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70248834703100
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: memcached
38
- requirement: &70248834702640 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
- - - ! '>='
45
+ - - ">="
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
48
  type: :development
45
49
  prerelease: false
46
- version_requirements: *70248834702640
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: dalli
49
- requirement: &70248834702220 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - ">="
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *70248834702220
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bump
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
58
97
  description: Rack::Cache is suitable as a quick drop-in component to enable HTTP caching
59
98
  for Rack-based applications that produce freshness (Expires, Cache-Control) and/or
60
99
  validation (Last-Modified, ETag) information.
@@ -62,27 +101,13 @@ email: r@tomayko.com
62
101
  executables: []
63
102
  extensions: []
64
103
  extra_rdoc_files:
65
- - README
66
- - COPYING
67
- - TODO
104
+ - README.md
105
+ - MIT-LICENSE
68
106
  - CHANGES
69
107
  files:
70
108
  - CHANGES
71
- - COPYING
72
- - Gemfile
73
- - README
74
- - Rakefile
75
- - TODO
76
- - doc/configuration.markdown
77
- - doc/faq.markdown
78
- - doc/index.markdown
79
- - doc/layout.html.erb
80
- - doc/license.markdown
81
- - doc/rack-cache.css
82
- - doc/server.ru
83
- - doc/storage.markdown
84
- - example/sinatra/app.rb
85
- - example/sinatra/views/index.erb
109
+ - MIT-LICENSE
110
+ - README.md
86
111
  - lib/rack-cache.rb
87
112
  - lib/rack/cache.rb
88
113
  - lib/rack/cache/appengine.rb
@@ -95,57 +120,34 @@ files:
95
120
  - lib/rack/cache/request.rb
96
121
  - lib/rack/cache/response.rb
97
122
  - lib/rack/cache/storage.rb
98
- - rack-cache.gemspec
99
- - test/cache_test.rb
100
- - test/cachecontrol_test.rb
101
- - test/context_test.rb
102
- - test/entitystore_test.rb
103
- - test/key_test.rb
104
- - test/metastore_test.rb
105
- - test/options_test.rb
106
- - test/pony.jpg
107
- - test/request_test.rb
108
- - test/response_test.rb
109
- - test/spec_setup.rb
110
- - test/storage_test.rb
111
- homepage: http://tomayko.com/src/rack-cache/
112
- licenses: []
123
+ homepage: https://github.com/rtomayko/rack-cache
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
113
127
  post_install_message:
114
128
  rdoc_options:
115
- - --line-numbers
116
- - --inline-source
117
- - --title
129
+ - "--line-numbers"
130
+ - "--inline-source"
131
+ - "--title"
118
132
  - Rack::Cache
119
- - --main
133
+ - "--main"
120
134
  - Rack::Cache
121
135
  require_paths:
122
136
  - lib
123
137
  required_ruby_version: !ruby/object:Gem::Requirement
124
- none: false
125
138
  requirements:
126
- - - ! '>='
139
+ - - ">="
127
140
  - !ruby/object:Gem::Version
128
- version: '0'
141
+ version: 2.0.0
129
142
  required_rubygems_version: !ruby/object:Gem::Requirement
130
- none: false
131
143
  requirements:
132
- - - ! '>='
144
+ - - ">="
133
145
  - !ruby/object:Gem::Version
134
146
  version: '0'
135
147
  requirements: []
136
148
  rubyforge_project:
137
- rubygems_version: 1.8.11
149
+ rubygems_version: 2.4.5.1
138
150
  signing_key:
139
- specification_version: 2
151
+ specification_version: 4
140
152
  summary: HTTP Caching for Rack
141
- test_files:
142
- - test/cache_test.rb
143
- - test/cachecontrol_test.rb
144
- - test/context_test.rb
145
- - test/entitystore_test.rb
146
- - test/key_test.rb
147
- - test/metastore_test.rb
148
- - test/options_test.rb
149
- - test/request_test.rb
150
- - test/response_test.rb
151
- - test/storage_test.rb
153
+ test_files: []
data/Gemfile DELETED
@@ -1,2 +0,0 @@
1
- source :rubygems
2
- gemspec
data/README DELETED
@@ -1,126 +0,0 @@
1
- Rack::Cache
2
- ===========
3
-
4
- Rack::Cache is suitable as a quick drop-in component to enable HTTP caching for
5
- Rack-based applications that produce freshness (Expires, Cache-Control) and/or
6
- validation (Last-Modified, ETag) information:
7
-
8
- * Standards-based (RFC 2616)
9
- * Freshness/expiration based caching
10
- * Validation (If-Modified-Since / If-None-Match)
11
- * Vary support
12
- * Cache-Control: public, private, max-age, s-maxage, must-revalidate,
13
- and proxy-revalidate.
14
- * Portable: 100% Ruby / works with any Rack-enabled framework
15
- * Disk, memcached, and heap memory storage backends
16
-
17
- For more information about Rack::Cache features and usage, see:
18
-
19
- http://tomayko.com/src/rack-cache/
20
-
21
- Rack::Cache is not overly optimized for performance. The main goal of the
22
- project is to provide a portable, easy-to-configure, and standards-based
23
- caching solution for small to medium sized deployments. More sophisticated /
24
- high-performance caching systems (e.g., Varnish, Squid, httpd/mod-cache) may be
25
- more appropriate for large deployments with significant throughput requirements.
26
-
27
- Installation
28
- ------------
29
-
30
- From Gem:
31
-
32
- $ sudo gem install rack-cache
33
-
34
- With a local working copy:
35
-
36
- $ git clone git://github.com/rtomayko/rack-cache.git
37
- $ rake package && sudo rake install
38
-
39
- Basic Usage
40
- -----------
41
-
42
- Rack::Cache is implemented as a piece of Rack middleware and can be used with
43
- any Rack-based application. If your application includes a rackup (`.ru`) file
44
- or uses Rack::Builder to construct the application pipeline, simply require
45
- and use as follows:
46
-
47
- require 'rack/cache'
48
-
49
- use Rack::Cache,
50
- :metastore => 'file:/var/cache/rack/meta',
51
- :entitystore => 'file:/var/cache/rack/body',
52
- :verbose => true
53
-
54
- run app
55
-
56
- Assuming you've designed your backend application to take advantage of HTTP's
57
- caching features, no further code or configuration is required for basic
58
- caching.
59
-
60
- Using with Rails
61
- ----------------
62
-
63
- Add this to your `config/environment.rb`:
64
-
65
- config.middleware.use Rack::Cache,
66
- :verbose => true,
67
- :metastore => 'file:/var/cache/rack/meta',
68
- :entitystore => 'file:/var/cache/rack/body'
69
-
70
- You should now see `Rack::Cache` listed in the middleware pipeline:
71
-
72
- rake middleware
73
-
74
- See the following for more information:
75
-
76
- http://snippets.aktagon.com/snippets/302
77
-
78
- Using with Dalli
79
- ----------------
80
-
81
- Dalli is a high performance memcached client for Ruby.
82
- More information at: https://github.com/mperham/dalli
83
-
84
- require 'dalli'
85
- require 'rack/cache'
86
-
87
- use Rack::Cache,
88
- :verbose => true,
89
- :metastore => "memcached://localhost:11211/meta",
90
- :entitystore => "memcached://localhost:11211/body"
91
-
92
- run app
93
-
94
- Links
95
- -----
96
-
97
- Documentation:
98
- http://tomayko.com/src/rack-cache/
99
-
100
- Mailing List:
101
- http://groups.google.com/group/rack-cache
102
-
103
- GitHub:
104
- http://github.com/rtomayko/rack-cache/
105
-
106
- License
107
- -------
108
-
109
- Copyright (c) 2008 Ryan Tomayko <http://tomayko.com/about>
110
-
111
- Permission is hereby granted, free of charge, to any person obtaining a copy
112
- of this software and associated documentation files (the "Software"), to
113
- deal in the Software without restriction, including without limitation the
114
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
115
- sell copies of the Software, and to permit persons to whom the Software is
116
- furnished to do so, subject to the following conditions:
117
-
118
- The above copyright notice and this permission notice shall be included in
119
- all copies or substantial portions of the Software.
120
-
121
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
122
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
123
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
124
- THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
125
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
126
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.