cache_rules 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -3
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -0
- data/README.md +2 -2
- data/Rakefile +1 -1
- data/cache_rules.gemspec +1 -1
- data/lib/cache_rules.rb +1 -3
- data/lib/formatting.rb +1 -1
- data/lib/helpers.rb +19 -7
- data/test/helper.rb +1 -1
- data/test/test_cache_rules.rb +6 -3
- data/test/test_formatting.rb +2 -0
- data/test/test_helpers.rb +11 -3
- metadata +2 -1
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -56,7 +56,7 @@ HTTP Caching request.
|
|
56
56
|
| **Is a stale response acceptable?** | - | - | - | - | 1 | 1 | 0 | - | - |
|
57
57
|
| |
|
58
58
|
| **Actions** | |
|
59
|
-
| **Revalidate** | | | | | | | |
|
59
|
+
| **Revalidate** | | | | | | | | 1 | 1 |
|
60
60
|
| **Add Age header (regeneratte**) | | | 1 | 1 | 1 | 1 | | | |
|
61
61
|
| **Add Cache-Lookup header** | MISS | MISS | HIT | HIT | STALE | STALE | EXPIRED | | |
|
62
62
|
| **Add Warning header** | | | | | 110 | 110 | | | |
|
@@ -78,7 +78,7 @@ HTTP Caching request.
|
|
78
78
|
| **Add Cache-Lookup header** | REVALIDATED | REVALIDATED | EXPIRED | STALE | STALE | EXPIRED |
|
79
79
|
| **Add Warning header** | | | | 111 | 111 | |
|
80
80
|
| **Return Status Code** | 200 | 304 | 504 | 200 | 304 | 307 |
|
81
|
-
| **Return Body** | cached | | | stale |
|
81
|
+
| **Return Body** | cached | | | stale | | |
|
82
82
|
|
83
83
|
## RFC compliance
|
84
84
|
|
data/Rakefile
CHANGED
data/cache_rules.gemspec
CHANGED
data/lib/cache_rules.rb
CHANGED
@@ -54,8 +54,6 @@ module CacheRules
|
|
54
54
|
Age Content-Length Max-Forwards
|
55
55
|
)
|
56
56
|
|
57
|
-
HEADERS_304 = %w(Cache-Control Content-Location Date ETag Expires Vary)
|
58
|
-
|
59
57
|
OPTIONS_CACHE = HEADERS_CSV.select {|header| header == 'Cache-Control' }
|
60
58
|
OPTIONS_CSV = HEADERS_CSV.reject {|header| header == 'Cache-Control' }
|
61
59
|
OPTIONS_RETRY = %w(Retry-After)
|
@@ -137,7 +135,7 @@ module CacheRules
|
|
137
135
|
column = RESPONSE_MAP[helper_run_validate.call(RESPONSE_TABLE[:conditions], request_headers, cached_headers, response_headers).join]
|
138
136
|
|
139
137
|
# 2. return the response
|
140
|
-
helper_response url, RESPONSE_TABLE[:actions], column, cached_headers
|
138
|
+
helper_response url, RESPONSE_TABLE[:actions], column, cached_headers, response_headers
|
141
139
|
rescue => error
|
142
140
|
{:code => 504, :body => 'Gateway Timeout', :headers => [], :error => error.message, :debug => error}
|
143
141
|
end
|
data/lib/formatting.rb
CHANGED
@@ -104,7 +104,7 @@ module CacheRules
|
|
104
104
|
def httpdate_helper(header)
|
105
105
|
# source: https://tools.ietf.org/html/rfc7231#section-7.1.1.1
|
106
106
|
DateTime.parse(header).to_time.to_i
|
107
|
-
rescue => e
|
107
|
+
rescue ArgumentError => e
|
108
108
|
# If the supplied date is invalid, use a time in the past (5 minutes ago)
|
109
109
|
# source: https://tools.ietf.org/html/rfc7234#section-5.3
|
110
110
|
Time.now.gmtime.to_i - 300
|
data/lib/helpers.rb
CHANGED
@@ -61,11 +61,12 @@ module CacheRules
|
|
61
61
|
end
|
62
62
|
|
63
63
|
# Returns the response body, code and headers based on the actions results
|
64
|
-
def helper_response(url, actions, column, cached)
|
64
|
+
def helper_response(url, actions, column, cached, response = {})
|
65
65
|
_, age, x_cache, warning, status, body = helper_run_action actions, column, cached
|
66
66
|
|
67
|
-
|
68
|
-
|
67
|
+
normalized = normalize.call response
|
68
|
+
headers_304 = helper_headers_200_304.call(cached, normalized) if status == 200 || status == 304
|
69
|
+
headers_url = {'Location' => url} if status == 307
|
69
70
|
|
70
71
|
headers = [age, warning, x_cache, headers_304, headers_url].compact.reduce &:merge
|
71
72
|
|
@@ -83,11 +84,22 @@ module CacheRules
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
86
|
-
# Generate the same headers if they exist for 304 responses
|
87
|
+
# Generate the same headers if they exist for 200/304 responses
|
87
88
|
# source: https://tools.ietf.org/html/rfc7232#section-4.1
|
88
|
-
def
|
89
|
-
Proc.new {|cached|
|
90
|
-
|
89
|
+
def helper_headers_200_304
|
90
|
+
Proc.new {|cached, response|
|
91
|
+
new_headers = response.select &helper_remove_warning_1xx
|
92
|
+
unnormalize_fields.call cached.merge(new_headers).reject {|key, _|
|
93
|
+
key == 'X-Cache-Req-Date' || key == 'X-Cache-Res-Date' || key == 'Status'
|
94
|
+
}
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
# delete 1xx Warning headers
|
99
|
+
# source: https://tools.ietf.org/html/rfc7234#section-4.3.4
|
100
|
+
def helper_remove_warning_1xx
|
101
|
+
Proc.new {|key, value|
|
102
|
+
{key => value} unless key == 'Warning' && value.reject! {|x| x =~ /^1\d{2}/ } && value.length == 0
|
91
103
|
}
|
92
104
|
end
|
93
105
|
|
data/test/helper.rb
CHANGED
data/test/test_cache_rules.rb
CHANGED
@@ -128,25 +128,28 @@ class TestCacheRules < MiniTest::Test
|
|
128
128
|
request = {"Host"=>"test.url", "If-None-Match"=>["*"], "Cache-Control"=>{"max-age"=>{"token"=>"100000000", "quoted_string"=>nil}}}
|
129
129
|
cached = {"Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "Cache-Control"=>{"s-maxage"=>{"token"=>"100000000", "quoted_string"=>nil}}, "X-Cache-Req-Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "X-Cache-Res-Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "Last-Modified" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}}
|
130
130
|
|
131
|
-
FakeWeb.register_uri(:head, "http://test.url/test1", :status => ["304", "Not Modified"], :date => "Sat, 03 Jan 2015 07:15:45 GMT")
|
131
|
+
FakeWeb.register_uri(:head, "http://test.url/test1", :status => ["304", "Not Modified"], :date => "Sat, 03 Jan 2015 07:15:45 GMT", :Warning => "299 - \"Hello World\"")
|
132
132
|
result = CacheRules.revalidate_response('http://test.url/test1', request, cached)
|
133
133
|
|
134
134
|
assert_equal result[:code], 200
|
135
135
|
assert_equal result[:body], 'cached'
|
136
136
|
assert_equal result[:headers]['Cache-Lookup'], 'REVALIDATED'
|
137
|
+
assert_equal result[:headers]['Warning'], "299 - \"Hello World\""
|
137
138
|
end
|
138
139
|
|
139
140
|
def test_revalidate_response_column1
|
140
141
|
request = {"Host"=>"test.url", "If-None-Match"=>["\"validEtag\""], "Cache-Control"=>{"max-age"=>{"token"=>"100000000", "quoted_string"=>nil}}}
|
141
|
-
cached = {"Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "Cache-Control"=>{"s-maxage"=>{"token"=>"100000000", "quoted_string"=>nil}}, "X-Cache-Req-Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "X-Cache-Res-Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "Last-Modified" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "ETag" => "\"validEtag\""}
|
142
|
+
cached = {"Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "Cache-Control"=>{"s-maxage"=>{"token"=>"100000000", "quoted_string"=>nil}}, "X-Cache-Req-Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "X-Cache-Res-Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "Last-Modified" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "ETag" => "\"validEtag\"", "Content-Type" => "text/html"}
|
142
143
|
|
143
|
-
FakeWeb.register_uri(:head, "http://test.url/test1", :status => ["304", "Not Modified"], :date => "Sat, 03 Jan 2015 07:15:45 GMT", :ETag => "\"validEtag\"")
|
144
|
+
FakeWeb.register_uri(:head, "http://test.url/test1", :status => ["304", "Not Modified"], :date => "Sat, 03 Jan 2015 07:15:45 GMT", :ETag => "\"validEtag\"", :Warning => "299 - \"Hello World\"")
|
144
145
|
result = CacheRules.revalidate_response('http://test.url/test1', request, cached)
|
145
146
|
|
146
147
|
assert_equal result[:code], 304
|
147
148
|
assert_nil result[:body]
|
148
149
|
assert_equal result[:headers]['Cache-Lookup'], 'REVALIDATED'
|
149
150
|
assert_equal result[:headers]['ETag'], "\"validEtag\""
|
151
|
+
assert_equal result[:headers]['Warning'], "299 - \"Hello World\""
|
152
|
+
assert_equal result[:headers]['Content-Type'], "text/html"
|
150
153
|
end
|
151
154
|
|
152
155
|
def test_revalidate_response_column2_5xx
|
data/test/test_formatting.rb
CHANGED
@@ -126,10 +126,12 @@ class TestFormatting < MiniTest::Test
|
|
126
126
|
timestamp1 = CacheRules.httpdate_helper httpdate
|
127
127
|
timestamp2 = CacheRules.httpdate_helper rfc850
|
128
128
|
timestamp3 = CacheRules.httpdate_helper ansi_c
|
129
|
+
timestamp4 = CacheRules.httpdate_helper 'invalid!(@*&^#%$'
|
129
130
|
|
130
131
|
assert_equal timestamp1, result
|
131
132
|
assert_equal timestamp2, result
|
132
133
|
assert_equal timestamp3, result
|
134
|
+
assert timestamp4
|
133
135
|
end
|
134
136
|
|
135
137
|
end
|
data/test/test_helpers.rb
CHANGED
@@ -172,12 +172,20 @@ class TestHelpers < MiniTest::Test
|
|
172
172
|
assert_nil noop
|
173
173
|
end
|
174
174
|
|
175
|
-
def
|
176
|
-
headers = CacheRules.
|
175
|
+
def test_headers_200_304
|
176
|
+
headers = CacheRules.helper_headers_200_304.call(@cached_headers, {'Warning' => ['199 - Hello World']})
|
177
177
|
|
178
178
|
assert_kind_of Hash, headers
|
179
179
|
|
180
|
-
assert_equal headers, {"Date"=>"Fri, 02 Jan 2015 11:03:45 GMT", "Cache-Control"=>"public, max-stale=1000, no-cache=\"Cookie\"", "ETag"=>"\"validEtag\""}
|
180
|
+
assert_equal headers, {"Date"=>"Fri, 02 Jan 2015 11:03:45 GMT", "Cache-Control"=>"public, max-stale=1000, no-cache=\"Cookie\"", "Last-Modified"=>"Fri, 02 Jan 2015 11:03:45 GMT", "ETag"=>"\"validEtag\""}
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_remove_warning_1xx
|
184
|
+
one_result = CacheRules.helper_remove_warning_1xx.call 'Warning', ["199 - \"This is a test\"", "299 - Hello World"]
|
185
|
+
nil_result = CacheRules.helper_remove_warning_1xx.call 'Warning', ["199 - \"This is a test\""]
|
186
|
+
|
187
|
+
assert_equal one_result, {"Warning"=>["299 - Hello World"]}
|
188
|
+
assert_nil nil_result
|
181
189
|
end
|
182
190
|
|
183
191
|
def test_helper_has_star
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cache_rules
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -86,6 +86,7 @@ extra_rdoc_files: []
|
|
86
86
|
files:
|
87
87
|
- .gitignore
|
88
88
|
- .travis.yml
|
89
|
+
- CHANGELOG.md
|
89
90
|
- Gemfile
|
90
91
|
- Gemfile.lock
|
91
92
|
- LICENSE
|