cache_rules 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +6 -0
- data/README.md +10 -11
- data/cache_rules.gemspec +1 -1
- data/lib/cache_rules.rb +6 -7
- data/lib/validations.rb +1 -1
- data/test/test_cache_rules.rb +12 -27
- data/test/test_helpers.rb +0 -3
- data/test/test_tables.rb +9 -10
- data/test/test_validations.rb +2 -0
- metadata +1 -1
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -66,19 +66,18 @@ HTTP Caching request.
|
|
66
66
|
### Revalidation Table
|
67
67
|
|
68
68
|
| Revalidation Conditions | | | | | | |
|
69
|
-
| :------------------------| :---: | :---: | :---: | :---: | :---: |
|
70
|
-
| **Did we get an error or 5xx code?** | 0 | 0 | 1 | 1 | 1 |
|
71
|
-
| **Is
|
72
|
-
| **
|
73
|
-
| **Do Etags/If-None-Match match?** | 0 | 1 | - | 0 | 1 | - |
|
69
|
+
| :------------------------| :---: | :---: | :---: | :---: | :---: |
|
70
|
+
| **Did we get an error or 5xx code?** | 0 | 0 | 1 | 1 | 1 |
|
71
|
+
| **Is there an if-only-cached header?** | - | - | 0 | 1 | 1 |
|
72
|
+
| **Do Etags/If-None-Match match?** | 0 | 1 | - | 0 | 1 |
|
74
73
|
| |
|
75
74
|
| **Actions** | |
|
76
|
-
| **Revalidate** | | | | | |
|
77
|
-
| **Add Age header (regeneratte**) | 1 | 1 | | 1 | 1 |
|
78
|
-
| **Add Cache-Lookup header** | REVALIDATED | REVALIDATED | EXPIRED | STALE | STALE |
|
79
|
-
| **Add Warning header** | | | | 111 | 111 |
|
80
|
-
| **Return Status Code** | 200 | 304 | 504 | 200 | 304 |
|
81
|
-
| **Return Body** | cached | | | stale | |
|
75
|
+
| **Revalidate** | | | | | |
|
76
|
+
| **Add Age header (regeneratte**) | 1 | 1 | | 1 | 1 |
|
77
|
+
| **Add Cache-Lookup header** | REVALIDATED | REVALIDATED | EXPIRED | STALE | STALE |
|
78
|
+
| **Add Warning header** | | | | 111 | 111 |
|
79
|
+
| **Return Status Code** | 200 | 304 | 504 | 200 | 304 |
|
80
|
+
| **Return Body** | cached | | | stale | |
|
82
81
|
|
83
82
|
## RFC compliance
|
84
83
|
|
data/cache_rules.gemspec
CHANGED
data/lib/cache_rules.rb
CHANGED
@@ -84,18 +84,17 @@ module CacheRules
|
|
84
84
|
# Decision table for revalidated responses
|
85
85
|
RESPONSE_TABLE = {
|
86
86
|
:conditions => {
|
87
|
-
'is_error' => [0, 0, 1, 1, 1
|
88
|
-
'
|
89
|
-
'
|
90
|
-
'validator_match' => [0, 1, X, 0, 1, X]
|
87
|
+
'is_error' => [0, 0, 1, 1, 1],
|
88
|
+
'allow_stale' => [X, X, 0, 1, 1],
|
89
|
+
'validator_match' => [0, 1, X, 0, 1]
|
91
90
|
},
|
92
91
|
:actions => {
|
93
92
|
'revalidate' => [],
|
94
93
|
'add_age' => [1, 1, X, 1, 1],
|
95
|
-
'add_x_cache' => %w(REVALIDATED REVALIDATED EXPIRED STALE STALE
|
94
|
+
'add_x_cache' => %w(REVALIDATED REVALIDATED EXPIRED STALE STALE),
|
96
95
|
'add_warning' => [X, X, X, '111 - "Revalidation Failed"', '111 - "Revalidation Failed"'],
|
97
|
-
'add_status' => [200, 304, 504, 200, 304
|
98
|
-
'return_body' => ['cached', X, 'Gateway Timeout', 'stale'
|
96
|
+
'add_status' => [200, 304, 504, 200, 304],
|
97
|
+
'return_body' => ['cached', X, 'Gateway Timeout', 'stale']
|
99
98
|
}
|
100
99
|
}
|
101
100
|
|
data/lib/validations.rb
CHANGED
@@ -123,7 +123,7 @@ module CacheRules
|
|
123
123
|
|
124
124
|
def validate_validator_match?(headers)
|
125
125
|
request, response = headers.values_at :request, :response
|
126
|
-
to_bit { response['ETag'] && request['If-None-Match'] && request['If-None-Match'].include?(response['ETag']) }
|
126
|
+
to_bit { response['ETag'] && request['If-None-Match'] && (request['If-None-Match'].include?(response['ETag']) || request['If-None-Match'].include?("*")) }
|
127
127
|
end
|
128
128
|
|
129
129
|
end
|
data/test/test_cache_rules.rb
CHANGED
@@ -80,7 +80,7 @@ class TestCacheRules < MiniTest::Test
|
|
80
80
|
|
81
81
|
result = CacheRules.validate('http://test.url/test1', request, cached)
|
82
82
|
|
83
|
-
assert_equal result[:code]
|
83
|
+
assert_equal 200, result[:code]
|
84
84
|
assert_equal result[:body], 'stale'
|
85
85
|
assert_equal result[:headers]['Cache-Lookup'], 'STALE'
|
86
86
|
assert_equal result[:headers]['Warning'], "110 - \"Response is Stale\""
|
@@ -110,29 +110,27 @@ class TestCacheRules < MiniTest::Test
|
|
110
110
|
end
|
111
111
|
|
112
112
|
def test_validate_column7
|
113
|
-
request = {"Host"=>"test.url", "Cache-Control"=>"max-stale=0", "If-None-Match"=>"*"}
|
113
|
+
request = {"Host"=>"test.url", "Cache-Control"=>"max-stale=0", "If-None-Match"=>["*"]}
|
114
114
|
cached = {"Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "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}, "Last-Modified" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "ETag" => "\"validEtag\"", "Cache-Control"=>{"max-age"=>{"token"=>"100", "quoted_string" => nil}, "must-revalidate"=>{"token"=>nil, "quoted_string"=>nil}}}
|
115
115
|
|
116
116
|
FakeWeb.register_uri(:head, "http://test.url/test1", :status => ["304", "Not Modified"], :date => "Sat, 03 Jan 2015 07:15:45 GMT")
|
117
117
|
result = CacheRules.validate('http://test.url/test1', request, cached)
|
118
118
|
|
119
|
-
assert_equal result[:code],
|
120
|
-
|
121
|
-
assert_equal result[:headers]['Cache-Lookup'], '
|
122
|
-
assert_equal result[:headers]['Location'], "http://test.url/test1"
|
119
|
+
assert_equal result[:code], 200
|
120
|
+
assert_equal result[:body], "cached"
|
121
|
+
assert_equal result[:headers]['Cache-Lookup'], 'REVALIDATED'
|
123
122
|
end
|
124
123
|
|
125
124
|
def test_validate_column8
|
126
|
-
request = {"Host"=>"test.url", "Cache-Control"=>"max-stale=0", "If-None-Match"=>"*"}
|
125
|
+
request = {"Host"=>"test.url", "Cache-Control"=>"max-stale=0", "If-None-Match"=>["*"]}
|
127
126
|
cached = {"Date"=>{"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "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}, "Last-Modified" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}, "ETag" => "\"validEtag\"", "Cache-Control"=>{"max-age"=>{"token"=>"100", "quoted_string" => nil}, "no-cache"=>{"token"=>nil, "quoted_string"=>nil}}}
|
128
127
|
|
129
|
-
FakeWeb.register_uri(:head, "http://test.url/
|
130
|
-
result = CacheRules.validate('http://test.url/
|
128
|
+
FakeWeb.register_uri(:head, "http://test.url/test2", :status => ["304", "Not Modified"], :date => "Sat, 03 Jan 2015 07:15:45 GMT")
|
129
|
+
result = CacheRules.validate('http://test.url/test2', request, cached)
|
131
130
|
|
132
|
-
assert_equal result[:code]
|
133
|
-
|
134
|
-
assert_equal result[:headers]['Cache-Lookup'], '
|
135
|
-
assert_equal result[:headers]['Location'], "http://test.url/test1"
|
131
|
+
assert_equal 200, result[:code]
|
132
|
+
assert_equal result[:body], "cached"
|
133
|
+
assert_equal result[:headers]['Cache-Lookup'], 'REVALIDATED'
|
136
134
|
end
|
137
135
|
|
138
136
|
def test_revalidate_response_column0
|
@@ -144,7 +142,7 @@ class TestCacheRules < MiniTest::Test
|
|
144
142
|
|
145
143
|
assert_equal result[:code], 200
|
146
144
|
assert_equal result[:body], 'cached'
|
147
|
-
assert_equal result[:headers]['Cache-Lookup']
|
145
|
+
assert_equal 'REVALIDATED', result[:headers]['Cache-Lookup']
|
148
146
|
assert_equal result[:headers]['Warning'], "299 - \"Hello World\""
|
149
147
|
end
|
150
148
|
|
@@ -210,19 +208,6 @@ class TestCacheRules < MiniTest::Test
|
|
210
208
|
assert_equal result[:headers]['ETag'], "\"validEtag\""
|
211
209
|
end
|
212
210
|
|
213
|
-
def test_revalidate_response_column5
|
214
|
-
request = {"Host"=>"test.url", "If-None-Match"=>["*"], "Cache-Control"=>{"max-stale"=>{"token"=>"100000000", "quoted_string"=>nil}}}
|
215
|
-
cached = {"Date"=>{"httpdate"=>"Thu, 01 Jan 2015 07:03:45 GMT", "timestamp"=>1420095825}, "Cache-Control"=>{"public"=>{"token"=>nil, "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}}
|
216
|
-
|
217
|
-
FakeWeb.register_uri(:head, "http://test.url/test1", :status => ["200", "OK"])
|
218
|
-
result = CacheRules.revalidate_response('http://test.url/test1', request, cached)
|
219
|
-
|
220
|
-
assert_equal result[:code], 307
|
221
|
-
assert_nil result[:body]
|
222
|
-
assert_equal result[:headers]['Cache-Lookup'], 'EXPIRED'
|
223
|
-
assert_equal result[:headers]['Location'], "http://test.url/test1"
|
224
|
-
end
|
225
|
-
|
226
211
|
def test_make_http_request_with_entity_tag
|
227
212
|
result = CacheRules.make_request.call('http://test.url', @request_if_none_match, @cached_headers)
|
228
213
|
http = eval "http", result.binding
|
data/test/test_helpers.rb
CHANGED
@@ -125,7 +125,6 @@ class TestHelpers < MiniTest::Test
|
|
125
125
|
column2 = CacheRules.helper_response url, act, 2, @cached_headers
|
126
126
|
column3 = CacheRules.helper_response url, act, 3, @cached_headers
|
127
127
|
column4 = CacheRules.helper_response url, act, 4, @cached_headers
|
128
|
-
column5 = CacheRules.helper_response url, act, 5, @cached_headers
|
129
128
|
|
130
129
|
assert_equal column0[:body], 'cached'
|
131
130
|
assert_equal column0[:code], 200
|
@@ -157,8 +156,6 @@ class TestHelpers < MiniTest::Test
|
|
157
156
|
assert_equal column4[:headers]['ETag'], "\"validEtag\""
|
158
157
|
assert_includes column4[:headers], 'Age'
|
159
158
|
|
160
|
-
assert_equal column5, {:body=>nil, :code=>307, :headers=>{"Cache-Lookup"=>"EXPIRED", "Location"=>"http://test.url"}}
|
161
|
-
|
162
159
|
assert_kind_of String, column0[:headers]['Age']
|
163
160
|
end
|
164
161
|
|
data/test/test_tables.rb
CHANGED
@@ -2,7 +2,7 @@ class TestTables < MiniTest::Test
|
|
2
2
|
|
3
3
|
def setup
|
4
4
|
@request_map = {"0000000"=>0, "0000001"=>0, "0000010"=>1, "0000011"=>1, "0000100"=>0, "0000101"=>0, "0000110"=>1, "0000111"=>1, "0001000"=>0, "0001001"=>0, "0001010"=>1, "0001011"=>1, "0001100"=>0, "0001101"=>0, "0001110"=>1, "0001111"=>1, "0010000"=>0, "0010001"=>0, "0010010"=>1, "0010011"=>1, "0010100"=>0, "0010101"=>0, "0010110"=>1, "0010111"=>1, "0011000"=>0, "0011001"=>0, "0011010"=>1, "0011011"=>1, "0011100"=>0, "0011101"=>0, "0011110"=>1, "0011111"=>1, "0100000"=>0, "0100001"=>0, "0100010"=>1, "0100011"=>1, "0100100"=>0, "0100101"=>0, "0100110"=>1, "0100111"=>1, "0101000"=>0, "0101001"=>0, "0101010"=>1, "0101011"=>1, "0101100"=>0, "0101101"=>0, "0101110"=>1, "0101111"=>1, "0110000"=>0, "0110001"=>0, "0110010"=>1, "0110011"=>1, "0110100"=>0, "0110101"=>0, "0110110"=>1, "0110111"=>1, "0111000"=>0, "0111001"=>0, "0111010"=>1, "0111011"=>1, "0111100"=>0, "0111101"=>0, "0111110"=>1, "0111111"=>1, "1000000"=>2, "1000001"=>2, "1000010"=>2, "1000011"=>2, "1000100"=>6, "1000101"=>4, "1000110"=>6, "1000111"=>4, "1001000"=>3, "1001001"=>3, "1001010"=>3, "1001011"=>3, "1001100"=>6, "1001101"=>5, "1001110"=>6, "1001111"=>5, "1010000"=>8, "1010001"=>8, "1010010"=>8, "1010011"=>8, "1010100"=>8, "1010101"=>8, "1010110"=>8, "1010111"=>8, "1011000"=>8, "1011001"=>8, "1011010"=>8, "1011011"=>8, "1011100"=>8, "1011101"=>8, "1011110"=>8, "1011111"=>8, "1100000"=>2, "1100001"=>2, "1100010"=>2, "1100011"=>2, "1100100"=>7, "1100101"=>7, "1100110"=>7, "1100111"=>7, "1101000"=>3, "1101001"=>3, "1101010"=>3, "1101011"=>3, "1101100"=>7, "1101101"=>7, "1101110"=>7, "1101111"=>7, "1110000"=>8, "1110001"=>8, "1110010"=>8, "1110011"=>8, "1110100"=>8, "1110101"=>8, "1110110"=>8, "1110111"=>8, "1111000"=>8, "1111001"=>8, "1111010"=>8, "1111011"=>8, "1111100"=>8, "1111101"=>8, "1111110"=>8, "1111111"=>8}
|
5
|
-
@response_map = {"
|
5
|
+
@response_map = {"000"=>0, "001"=>1, "010"=>0, "011"=>1, "100"=>2, "101"=>2, "110"=>3, "111"=>4}
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_x_value
|
@@ -32,12 +32,12 @@ class TestTables < MiniTest::Test
|
|
32
32
|
assert_includes CacheRules::RESPONSE_TABLE, :conditions
|
33
33
|
assert_includes CacheRules::RESPONSE_TABLE, :actions
|
34
34
|
|
35
|
-
assert_equal CacheRules::RESPONSE_TABLE[:conditions].length,
|
35
|
+
assert_equal CacheRules::RESPONSE_TABLE[:conditions].length, 3
|
36
36
|
assert_equal CacheRules::RESPONSE_TABLE[:actions].length, 6
|
37
37
|
|
38
38
|
conditions = CacheRules::RESPONSE_TABLE[:conditions].keys
|
39
39
|
actions = CacheRules::RESPONSE_TABLE[:actions].keys
|
40
|
-
assert_equal conditions, %w(is_error
|
40
|
+
assert_equal conditions, %w(is_error allow_stale validator_match)
|
41
41
|
assert_equal actions, %w(revalidate add_age add_x_cache add_warning add_status return_body)
|
42
42
|
end
|
43
43
|
|
@@ -61,15 +61,14 @@ class TestTables < MiniTest::Test
|
|
61
61
|
def test_response_map_is_correct
|
62
62
|
assert_kind_of Hash, CacheRules::RESPONSE_MAP
|
63
63
|
|
64
|
-
assert_equal CacheRules::RESPONSE_MAP.length,
|
64
|
+
assert_equal CacheRules::RESPONSE_MAP.length, 8
|
65
65
|
assert_equal CacheRules::RESPONSE_MAP, @response_map
|
66
66
|
|
67
|
-
assert_equal CacheRules::RESPONSE_MAP["
|
68
|
-
assert_equal CacheRules::RESPONSE_MAP["
|
69
|
-
assert_equal CacheRules::RESPONSE_MAP["
|
70
|
-
assert_equal CacheRules::RESPONSE_MAP["
|
71
|
-
assert_equal CacheRules::RESPONSE_MAP["
|
72
|
-
assert_equal CacheRules::RESPONSE_MAP["0100"], 5
|
67
|
+
assert_equal CacheRules::RESPONSE_MAP["000"], 0
|
68
|
+
assert_equal CacheRules::RESPONSE_MAP["001"], 1
|
69
|
+
assert_equal CacheRules::RESPONSE_MAP["100"], 2
|
70
|
+
assert_equal CacheRules::RESPONSE_MAP["110"], 3
|
71
|
+
assert_equal CacheRules::RESPONSE_MAP["111"], 4
|
73
72
|
end
|
74
73
|
|
75
74
|
end
|
data/test/test_validations.rb
CHANGED
@@ -222,9 +222,11 @@ class TestValidations < MiniTest::Test
|
|
222
222
|
|
223
223
|
def test_validator_match
|
224
224
|
match = CacheRules.validate_validator_match?({:request => {'If-None-Match'=>["\"myetag\""]}, :response => {'ETag'=>"\"myetag\""}})
|
225
|
+
match1 = CacheRules.validate_validator_match?({:request => {'If-None-Match'=>["*"]}, :response => {'ETag'=>"\"myetag\""}})
|
225
226
|
nomatch = CacheRules.validate_validator_match?({:request => {'If-None-Match'=>["\"myetag\""]}, :response => {}})
|
226
227
|
|
227
228
|
assert_equal match, 1
|
229
|
+
assert_equal 1, match1
|
228
230
|
assert_equal nomatch, 0
|
229
231
|
end
|
230
232
|
|