cache_rules 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ vendor/
2
+ coverage/
3
+
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby
5
+ - 2.0.0
6
+ - 2.1.5
7
+ - 2.2.0
8
+ script: "bundle exec rake test"
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'coveralls', require: false
5
+ gem "rake"
6
+ gem "fakeweb", "~> 1.3"
7
+ gem 'minitest', '~> 5.5.0'
8
+ gem 'minitest-reporters', '~> 1.0.0'
9
+ gem 'simplecov'
10
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,47 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ ansi (1.5.0)
5
+ builder (3.2.2)
6
+ coveralls (0.7.8)
7
+ multi_json (~> 1.10)
8
+ rest-client (~> 1.7)
9
+ simplecov (~> 0.9.1)
10
+ term-ansicolor (~> 1.3)
11
+ thor (~> 0.19.1)
12
+ docile (1.1.5)
13
+ fakeweb (1.3.0)
14
+ mime-types (2.4.3)
15
+ minitest (5.5.1)
16
+ minitest-reporters (1.0.8)
17
+ ansi
18
+ builder
19
+ minitest (>= 5.0)
20
+ ruby-progressbar
21
+ multi_json (1.10.1)
22
+ netrc (0.10.2)
23
+ rake (10.4.2)
24
+ rest-client (1.7.2)
25
+ mime-types (>= 1.16, < 3.0)
26
+ netrc (~> 0.7)
27
+ ruby-progressbar (1.7.1)
28
+ simplecov (0.9.1)
29
+ docile (~> 1.1.0)
30
+ multi_json (~> 1.0)
31
+ simplecov-html (~> 0.8.0)
32
+ simplecov-html (0.8.0)
33
+ term-ansicolor (1.3.0)
34
+ tins (~> 1.0)
35
+ thor (0.19.1)
36
+ tins (1.3.3)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ coveralls
43
+ fakeweb (~> 1.3)
44
+ minitest (~> 5.5.0)
45
+ minitest-reporters (~> 1.0.0)
46
+ rake
47
+ simplecov
data/LICENSE ADDED
@@ -0,0 +1,340 @@
1
+ Mozilla Public License, version 2.0
2
+
3
+ 1. Definitions
4
+
5
+ 1.1. "Contributor"
6
+
7
+ means each individual or legal entity that creates, contributes to the
8
+ creation of, or owns Covered Software.
9
+
10
+ 1.2. "Contributor Version"
11
+
12
+ means the combination of the Contributions of others (if any) used by a
13
+ Contributor and that particular Contributor's Contribution.
14
+
15
+ 1.3. "Contribution"
16
+
17
+ means Covered Software of a particular Contributor.
18
+
19
+ 1.4. "Covered Software"
20
+
21
+ means Source Code Form to which the initial Contributor has attached the
22
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
23
+ Modifications of such Source Code Form, in each case including portions
24
+ thereof.
25
+
26
+ 1.5. "Incompatible With Secondary Licenses"
27
+ means
28
+
29
+ a. that the initial Contributor has attached the notice described in
30
+ Exhibit B to the Covered Software; or
31
+
32
+ b. that the Covered Software was made available under the terms of
33
+ version 1.1 or earlier of the License, but not also under the terms of
34
+ a Secondary License.
35
+
36
+ 1.6. "Executable Form"
37
+
38
+ means any form of the work other than Source Code Form.
39
+
40
+ 1.7. "Larger Work"
41
+
42
+ means a work that combines Covered Software with other material, in a
43
+ separate file or files, that is not Covered Software.
44
+
45
+ 1.8. "License"
46
+
47
+ means this document.
48
+
49
+ 1.9. "Licensable"
50
+
51
+ means having the right to grant, to the maximum extent possible, whether
52
+ at the time of the initial grant or subsequently, any and all of the
53
+ rights conveyed by this License.
54
+
55
+ 1.10. "Modifications"
56
+
57
+ means any of the following:
58
+
59
+ a. any file in Source Code Form that results from an addition to,
60
+ deletion from, or modification of the contents of Covered Software; or
61
+
62
+ b. any new file in Source Code Form that contains any Covered Software.
63
+
64
+ 1.11. "Patent Claims" of a Contributor
65
+
66
+ means any patent claim(s), including without limitation, method,
67
+ process, and apparatus claims, in any patent Licensable by such
68
+ Contributor that would be infringed, but for the grant of the License,
69
+ by the making, using, selling, offering for sale, having made, import,
70
+ or transfer of either its Contributions or its Contributor Version.
71
+
72
+ 1.12. "Secondary License"
73
+
74
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
75
+ General Public License, Version 2.1, the GNU Affero General Public
76
+ License, Version 3.0, or any later versions of those licenses.
77
+
78
+ 1.13. "Source Code Form"
79
+
80
+ means the form of the work preferred for making modifications.
81
+
82
+ 1.14. "You" (or "Your")
83
+
84
+ means an individual or a legal entity exercising rights under this
85
+ License. For legal entities, "You" includes any entity that controls, is
86
+ controlled by, or is under common control with You. For purposes of this
87
+ definition, "control" means (a) the power, direct or indirect, to cause
88
+ the direction or management of such entity, whether by contract or
89
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
90
+ outstanding shares or beneficial ownership of such entity.
91
+
92
+
93
+ 2. License Grants and Conditions
94
+
95
+ 2.1. Grants
96
+
97
+ Each Contributor hereby grants You a world-wide, royalty-free,
98
+ non-exclusive license:
99
+
100
+ a. under intellectual property rights (other than patent or trademark)
101
+ Licensable by such Contributor to use, reproduce, make available,
102
+ modify, display, perform, distribute, and otherwise exploit its
103
+ Contributions, either on an unmodified basis, with Modifications, or
104
+ as part of a Larger Work; and
105
+
106
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
107
+ sale, have made, import, and otherwise transfer either its
108
+ Contributions or its Contributor Version.
109
+
110
+ 2.2. Effective Date
111
+
112
+ The licenses granted in Section 2.1 with respect to any Contribution
113
+ become effective for each Contribution on the date the Contributor first
114
+ distributes such Contribution.
115
+
116
+ 2.3. Limitations on Grant Scope
117
+
118
+ The licenses granted in this Section 2 are the only rights granted under
119
+ this License. No additional rights or licenses will be implied from the
120
+ distribution or licensing of Covered Software under this License.
121
+ Notwithstanding Section 2.1(b) above, no patent license is granted by a
122
+ Contributor:
123
+
124
+ a. for any code that a Contributor has removed from Covered Software; or
125
+
126
+ b. for infringements caused by: (i) Your and any other third party's
127
+ modifications of Covered Software, or (ii) the combination of its
128
+ Contributions with other software (except as part of its Contributor
129
+ Version); or
130
+
131
+ c. under Patent Claims infringed by Covered Software in the absence of
132
+ its Contributions.
133
+
134
+ This License does not grant any rights in the trademarks, service marks,
135
+ or logos of any Contributor (except as may be necessary to comply with
136
+ the notice requirements in Section 3.4).
137
+
138
+ 2.4. Subsequent Licenses
139
+
140
+ No Contributor makes additional grants as a result of Your choice to
141
+ distribute the Covered Software under a subsequent version of this
142
+ License (see Section 10.2) or under the terms of a Secondary License (if
143
+ permitted under the terms of Section 3.3).
144
+
145
+ 2.5. Representation
146
+
147
+ Each Contributor represents that the Contributor believes its
148
+ Contributions are its original creation(s) or it has sufficient rights to
149
+ grant the rights to its Contributions conveyed by this License.
150
+
151
+ 2.6. Fair Use
152
+
153
+ This License is not intended to limit any rights You have under
154
+ applicable copyright doctrines of fair use, fair dealing, or other
155
+ equivalents.
156
+
157
+ 2.7. Conditions
158
+
159
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
160
+ Section 2.1.
161
+
162
+
163
+ 3. Responsibilities
164
+
165
+ 3.1. Distribution of Source Form
166
+
167
+ All distribution of Covered Software in Source Code Form, including any
168
+ Modifications that You create or to which You contribute, must be under
169
+ the terms of this License. You must inform recipients that the Source
170
+ Code Form of the Covered Software is governed by the terms of this
171
+ License, and how they can obtain a copy of this License. You may not
172
+ attempt to alter or restrict the recipients' rights in the Source Code
173
+ Form.
174
+
175
+ 3.2. Distribution of Executable Form
176
+
177
+ If You distribute Covered Software in Executable Form then:
178
+
179
+ a. such Covered Software must also be made available in Source Code Form,
180
+ as described in Section 3.1, and You must inform recipients of the
181
+ Executable Form how they can obtain a copy of such Source Code Form by
182
+ reasonable means in a timely manner, at a charge no more than the cost
183
+ of distribution to the recipient; and
184
+
185
+ b. You may distribute such Executable Form under the terms of this
186
+ License, or sublicense it under different terms, provided that the
187
+ license for the Executable Form does not attempt to limit or alter the
188
+ recipients' rights in the Source Code Form under this License.
189
+
190
+ 3.3. Distribution of a Larger Work
191
+
192
+ You may create and distribute a Larger Work under terms of Your choice,
193
+ provided that You also comply with the requirements of this License for
194
+ the Covered Software. If the Larger Work is a combination of Covered
195
+ Software with a work governed by one or more Secondary Licenses, and the
196
+ Covered Software is not Incompatible With Secondary Licenses, this
197
+ License permits You to additionally distribute such Covered Software
198
+ under the terms of such Secondary License(s), so that the recipient of
199
+ the Larger Work may, at their option, further distribute the Covered
200
+ Software under the terms of either this License or such Secondary
201
+ License(s).
202
+
203
+ 3.4. Notices
204
+
205
+ You may not remove or alter the substance of any license notices
206
+ (including copyright notices, patent notices, disclaimers of warranty, or
207
+ limitations of liability) contained within the Source Code Form of the
208
+ Covered Software, except that You may alter any license notices to the
209
+ extent required to remedy known factual inaccuracies.
210
+
211
+ 3.5. Application of Additional Terms
212
+
213
+ You may choose to offer, and to charge a fee for, warranty, support,
214
+ indemnity or liability obligations to one or more recipients of Covered
215
+ Software. However, You may do so only on Your own behalf, and not on
216
+ behalf of any Contributor. You must make it absolutely clear that any
217
+ such warranty, support, indemnity, or liability obligation is offered by
218
+ You alone, and You hereby agree to indemnify every Contributor for any
219
+ liability incurred by such Contributor as a result of warranty, support,
220
+ indemnity or liability terms You offer. You may include additional
221
+ disclaimers of warranty and limitations of liability specific to any
222
+ jurisdiction.
223
+
224
+ 4. Inability to Comply Due to Statute or Regulation
225
+
226
+ If it is impossible for You to comply with any of the terms of this License
227
+ with respect to some or all of the Covered Software due to statute,
228
+ judicial order, or regulation then You must: (a) comply with the terms of
229
+ this License to the maximum extent possible; and (b) describe the
230
+ limitations and the code they affect. Such description must be placed in a
231
+ text file included with all distributions of the Covered Software under
232
+ this License. Except to the extent prohibited by statute or regulation,
233
+ such description must be sufficiently detailed for a recipient of ordinary
234
+ skill to be able to understand it.
235
+
236
+ 5. Termination
237
+
238
+ 5.1. The rights granted under this License will terminate automatically if You
239
+ fail to comply with any of its terms. However, if You become compliant,
240
+ then the rights granted under this License from a particular Contributor
241
+ are reinstated (a) provisionally, unless and until such Contributor
242
+ explicitly and finally terminates Your grants, and (b) on an ongoing
243
+ basis, if such Contributor fails to notify You of the non-compliance by
244
+ some reasonable means prior to 60 days after You have come back into
245
+ compliance. Moreover, Your grants from a particular Contributor are
246
+ reinstated on an ongoing basis if such Contributor notifies You of the
247
+ non-compliance by some reasonable means, this is the first time You have
248
+ received notice of non-compliance with this License from such
249
+ Contributor, and You become compliant prior to 30 days after Your receipt
250
+ of the notice.
251
+
252
+ 5.2. If You initiate litigation against any entity by asserting a patent
253
+ infringement claim (excluding declaratory judgment actions,
254
+ counter-claims, and cross-claims) alleging that a Contributor Version
255
+ directly or indirectly infringes any patent, then the rights granted to
256
+ You by any and all Contributors for the Covered Software under Section
257
+ 2.1 of this License shall terminate.
258
+
259
+ 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
260
+ license agreements (excluding distributors and resellers) which have been
261
+ validly granted by You or Your distributors under this License prior to
262
+ termination shall survive termination.
263
+
264
+ 6. Disclaimer of Warranty
265
+
266
+ Covered Software is provided under this License on an "as is" basis,
267
+ without warranty of any kind, either expressed, implied, or statutory,
268
+ including, without limitation, warranties that the Covered Software is free
269
+ of defects, merchantable, fit for a particular purpose or non-infringing.
270
+ The entire risk as to the quality and performance of the Covered Software
271
+ is with You. Should any Covered Software prove defective in any respect,
272
+ You (not any Contributor) assume the cost of any necessary servicing,
273
+ repair, or correction. This disclaimer of warranty constitutes an essential
274
+ part of this License. No use of any Covered Software is authorized under
275
+ this License except under this disclaimer.
276
+
277
+ 7. Limitation of Liability
278
+
279
+ Under no circumstances and under no legal theory, whether tort (including
280
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
281
+ distributes Covered Software as permitted above, be liable to You for any
282
+ direct, indirect, special, incidental, or consequential damages of any
283
+ character including, without limitation, damages for lost profits, loss of
284
+ goodwill, work stoppage, computer failure or malfunction, or any and all
285
+ other commercial damages or losses, even if such party shall have been
286
+ informed of the possibility of such damages. This limitation of liability
287
+ shall not apply to liability for death or personal injury resulting from
288
+ such party's negligence to the extent applicable law prohibits such
289
+ limitation. Some jurisdictions do not allow the exclusion or limitation of
290
+ incidental or consequential damages, so this exclusion and limitation may
291
+ not apply to You.
292
+
293
+ 8. Litigation
294
+
295
+ Any litigation relating to this License may be brought only in the courts
296
+ of a jurisdiction where the defendant maintains its principal place of
297
+ business and such litigation shall be governed by laws of that
298
+ jurisdiction, without reference to its conflict-of-law provisions. Nothing
299
+ in this Section shall prevent a party's ability to bring cross-claims or
300
+ counter-claims.
301
+
302
+ 9. Miscellaneous
303
+
304
+ This License represents the complete agreement concerning the subject
305
+ matter hereof. If any provision of this License is held to be
306
+ unenforceable, such provision shall be reformed only to the extent
307
+ necessary to make it enforceable. Any law or regulation which provides that
308
+ the language of a contract shall be construed against the drafter shall not
309
+ be used to construe this License against a Contributor.
310
+
311
+
312
+ 10. Versions of the License
313
+
314
+ 10.1. New Versions
315
+
316
+ Mozilla Foundation is the license steward. Except as provided in Section
317
+ 10.3, no one other than the license steward has the right to modify or
318
+ publish new versions of this License. Each version will be given a
319
+ distinguishing version number.
320
+
321
+ 10.2. Effect of New Versions
322
+
323
+ You may distribute the Covered Software under the terms of the version
324
+ of the License under which You originally received the Covered Software,
325
+ or under the terms of any subsequent version published by the license
326
+ steward.
327
+
328
+ 10.3. Modified Versions
329
+
330
+ If you create software not governed by this License, and you want to
331
+ create a new license for such software, you may create and use a
332
+ modified version of this License if you rename the license and remove
333
+ any references to the name of the license steward (except to note that
334
+ such modified license differs from this License).
335
+
336
+ 10.4. Distributing Source Code Form that is Incompatible With Secondary
337
+ Licenses If You choose to distribute Source Code Form that is
338
+ Incompatible With Secondary Licenses under the terms of this version of
339
+ the License, the notice described in Exhibit B of this License must be
340
+ attached.
data/NOTICE ADDED
@@ -0,0 +1,26 @@
1
+ Regex parsing borrowed from: https://github.com/hapijs/wreck
2
+
3
+ Copyright (c) 2012-2014, Walmart and other contributors.
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * The names of any contributors may not be used to endorse or promote
14
+ products derived from this software without specific prior written
15
+ permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
21
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,145 @@
1
+ ## What is CacheRules
2
+
3
+ _CacheRules_ is a well-behaved HTTP caching library aimed at being RFC 7234 complaint.
4
+
5
+ This library does **not actually _cache_ anything**, and it is **not a _proxy_**.
6
+ It validates HTTP headers and returns the appropriate response to determine
7
+ if a request can be served from the cache.
8
+
9
+ It is up to the HTTP Cache implementation to store the cached results
10
+ and serve responses from the cache if necessary.
11
+
12
+ [![Build Status](https://travis-ci.org/aw/CacheRules.svg?branch=master)](https://travis-ci.org/aw/CacheRules) [![Coverage Status](https://coveralls.io/repos/aw/CacheRules/badge.svg?branch=master)](https://coveralls.io/r/aw/CacheRules?branch=master)
13
+
14
+ ## Getting started
15
+
16
+ Add this line to your Gemfile: `gem 'cache_rules'`
17
+
18
+ or
19
+
20
+ Install with: `gem install cache_rules`
21
+
22
+ ## Usage
23
+
24
+ There is only 1 _public API call_ when using this library: `validate()`.
25
+
26
+ ```ruby
27
+ require 'cache_rules'
28
+
29
+ url = 'https://status.rubygems.org'
30
+ request = {'Version' => 'HTTP/1.1'}
31
+ cached = {}
32
+
33
+ CacheRules.validate url, request, cached
34
+
35
+ => {:body=>nil, :code=>307, :headers=>{"Cache-Lookup"=>"MISS", "Location"=>"https://status.rubygems.org"}}
36
+ ```
37
+
38
+ The `request` headers must be a Ruby Hash or Array of 2-element Arrays.
39
+ The `cached` headers must already have been normalized by this caching library.
40
+
41
+ ## Decision tables
42
+
43
+ There are two decision tables to help figure out how to process each type of
44
+ HTTP Caching request.
45
+
46
+ ### Request/Cache Table
47
+
48
+ | HTTP Caching Conditions | | | | | | | | | |
49
+ | :------------------------| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
50
+ | **Are the headers cached?** | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
51
+ | **Must revalidate?** | - | - | - | - | 0 | 0 | 0 | 1 | - |
52
+ | **No-cache or max-age 0?** | - | - | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
53
+ | **Do Etags/If-None-Match match?** | - | - | 0 | 1 | 0 | 1 | - | - | - |
54
+ | **Is the cached data expired?** | - | - | 0 | 0 | 1 | 1 | 1 | 1 | - |
55
+ | **Is there an if-only-cached header?** | 0 | 1 | - | - | - | - | - | - | - |
56
+ | **Is a stale response acceptable?** | - | - | - | - | 1 | 1 | 0 | - | - |
57
+ | |
58
+ | **Actions** | |
59
+ | **Revalidate** | | | | | | | | | 1 | 1 |
60
+ | **Add Age header (regeneratte**) | | | 1 | 1 | 1 | 1 | | | |
61
+ | **Add Cache-Lookup header** | MISS | MISS | HIT | HIT | STALE | STALE | EXPIRED | | |
62
+ | **Add Warning header** | | | | | 110 | 110 | | | |
63
+ | **Return Status Code** | 307 | 504 | 200 | 304 | 200 | 304 | 504 | | |
64
+ | **Return Body** | | | cached | | stale | | | | |
65
+
66
+ ### Revalidation Table
67
+
68
+ | Revalidation Conditions | | | | | | |
69
+ | :------------------------| :---: | :---: | :---: | :---: | :---: | :---: |
70
+ | **Did we get an error or 5xx code?** | 0 | 0 | 1 | 1 | 1 | 0 |
71
+ | **Is the cached data expired?** | 0 | 0 | - | - | - | 1 |
72
+ | **Is there an if-only-cached header?** | - | - | 0 | 1 | 1 | - |
73
+ | **Do Etags/If-None-Match match?** | 0 | 1 | - | 0 | 1 | - |
74
+ | |
75
+ | **Actions** | |
76
+ | **Revalidate** | | | | | | |
77
+ | **Add Age header (regeneratte**) | 1 | 1 | | 1 | 1 | |
78
+ | **Add Cache-Lookup header** | REVALIDATED | REVALIDATED | EXPIRED | STALE | STALE | EXPIRED |
79
+ | **Add Warning header** | | | | 111 | 111 | |
80
+ | **Return Status Code** | 200 | 304 | 504 | 200 | 304 | 307 |
81
+ | **Return Body** | cached | | | stale | stale | |
82
+
83
+ ## RFC compliance
84
+
85
+ This HTTP Caching library aims to be RFC 7230-7235 compliant. It is a best
86
+ effort attempt to correctly interpret these documents. Some errors may exist,
87
+ so please [notify me](https://github.com/aw/CacheRules/issues/new) if something isn't processed correctly according to the RFCs.
88
+
89
+ ### Feature list
90
+
91
+ * Normalizing header names and field values (ex: `Last-Modified`)
92
+ * Ensuring date fields are correctly formatted (ex: `Fri, 31 Dec 1999 23:59:59 GMT`)
93
+ * Merging duplicate header fields
94
+ * Interop with HTTP/1.0 clients (ex: `Pragma: no-cache`)
95
+ * Weak entity-tag matching (ex: `If-None-Match: "W/abc123"`)
96
+ * Last modified date matching (ex: `If-Modified-Since: Thu, 01 Jan 2015 07:03:45 GMT`)
97
+ * Various header validation including Cache-Control headers
98
+ * Cache-Control directives with quoted strings (ex: `no-cache="Cookie"`)
99
+ * Removing non-cacheable headers (ex: `Authorization`)
100
+ * Correctly calculating freshness and current age of cached responses
101
+ * Explicit and Heuristic freshness calculation
102
+ * Returning 110 and 111 Warning headers when serving stale responses
103
+ * Revalidating expired responses with the origin server (using HEAD)
104
+ * Returning the correct status code based on validation/revalidation results
105
+ * Lots more little things sprinkled throughout the RFCs...
106
+ * Written in purely functional Ruby (mostly) with 100% unit/integration test coverage
107
+
108
+ ## Custom headers
109
+
110
+ Custom headers are generated to help with testing and compliance validation.
111
+
112
+ These are somewhat based on [CloudFlare's](https://support.cloudflare.com/hc/en-us/articles/200168266-What-do-the-various-CloudFlare-cache-responses-HIT-Expired-etc-mean-) cache headers:
113
+
114
+ * `Cache-Lookup: HIT`: resource is in cache and still valid. Serving from the cache.
115
+ * `Cache-Lookup: MISS`: resource is not in cache. Redirecting to the origin server.
116
+ * `Cache-Lookup: EXPIRED`: resource is in cache, but expired. Redirecting to the origin server or serving an error message.
117
+ * `Cache-Lookup: STALE`: resource is in cache and expired, but the origin server wasn't contacted successfully to revalidate the request. Serving stale response from the cache.
118
+ * `Cache-Lookup: REVALIDATED`: resource is in cache, was expired, but was revalidated successfully at the origin server. Serving from the cache.
119
+
120
+ ## Tests
121
+
122
+ Tests must cover 100% in order to pass. To run the tests, type:
123
+
124
+ `bundle exec rake test`
125
+
126
+ ## TODO
127
+
128
+ * Handling `Vary` header and different representations for the same resource
129
+ * Handling `206 (Partial)` and `Range` headers for resuming downloads
130
+ * Handling `Cache-Control: private` headers
131
+ * Caching other _cacheable_ responses such as [404 and 501](https://tools.ietf.org/html/rfc7231#section-6.1)
132
+
133
+ ## What is C.R.E.A.M. ?
134
+
135
+ C.R.E.A.M. is an influencial lyrical masterpiece from the 90s performed by the [Wu-Tang Clan](https://www.youtube.com/watch?v=PBwAxmrE194)
136
+
137
+ It's also the premise of this [troll video](http://cacheruleseverythingaround.me/)
138
+
139
+ ## LICENSE
140
+
141
+ This Source Code Form is subject to the terms of the Mozilla Public
142
+ License, v. 2.0. If a copy of the MPL was not distributed with this
143
+ file, You can obtain one at [http://mozilla.org/MPL/2.0/](http://mozilla.org/MPL/2.0/).
144
+
145
+ Copyright (c) 2014-2015 Alexander Williams, Unscramble