cache_rules 0.1.17 → 0.1.18

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ # 0.1.18 (2015-05-01)
4
+
5
+ * Ensure the 'Cache-Control: max-age' is validated
6
+ * Add regression tests
7
+ * Update documentation
8
+
3
9
  ## 0.1.17 (2015-04-30)
4
10
 
5
11
  * Return the proper 'Age' header and ignore the 'public' control directive
data/README.md CHANGED
@@ -49,7 +49,7 @@ HTTP Caching request.
49
49
  | :------------------------| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
50
50
  | **Are the headers cached?** | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
51
51
  | **Must revalidate?** | - | - | - | - | 0 | 0 | 0 | 1 | - |
52
- | **No-cache or max-age 0?** | - | - | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
52
+ | **No-cache or max-age reached?** | - | - | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
53
53
  | **Do Etags/If-None-Match match?** | - | - | 0 | 1 | 0 | 1 | - | - | - |
54
54
  | **Is the cached data expired?** | - | - | 0 | 0 | 1 | 1 | 1 | 1 | - |
55
55
  | **Is there an if-only-cached header?** | 0 | 1 | - | - | - | - | - | - | - |
@@ -125,6 +125,7 @@ To run the tests, type:
125
125
 
126
126
  ## TODO
127
127
 
128
+ * Validation of `s-maxage` [response header](https://tools.ietf.org/html/rfc7234#section-5.2.2.9)
128
129
  * Handling `Vary` header and different representations for the same resource
129
130
  * Handling `206 (Partial)` and `Range` headers for resuming downloads
130
131
  * Handling `Cache-Control: private` headers
data/cache_rules.gemspec CHANGED
@@ -6,7 +6,7 @@ require 'date'
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = 'cache_rules'
9
- s.version = '0.1.17'
9
+ s.version = '0.1.18'
10
10
 
11
11
  s.date = Date.today.to_s
12
12
 
data/lib/validations.rb CHANGED
@@ -47,7 +47,11 @@ module CacheRules
47
47
 
48
48
  response_is_fresh = freshness_lifetime.to_i > current_age
49
49
 
50
- to_bit { response_is_fresh != true }
50
+ return 1 if headers[:cached]['Cache-Control'] &&
51
+ headers[:cached]['Cache-Control']['max-age'] &&
52
+ current_age > headers[:cached]['Cache-Control']['max-age']['token'].to_i
53
+
54
+ to_bit { (response_is_fresh != true) }
51
55
  end
52
56
 
53
57
  def validate_only_if_cached?(headers)
@@ -85,8 +89,16 @@ module CacheRules
85
89
 
86
90
  # Must revalidate if this request header exists
87
91
  # source: https://tools.ietf.org/html/rfc7234#section-5.2.1.4
88
- return 1 if (( request = request_headers['Cache-Control'] )) &&
89
- request_headers['Cache-Control']['no-cache']
92
+ if request_headers['Cache-Control']
93
+ _, current_age = helper_freshness_lifetime.call cached_headers
94
+
95
+ # If max-age is 0 or if the current age is above the max-age and max-stale isn't set
96
+ # source: https://tools.ietf.org/html/rfc7234#section-5.2.1.1
97
+ return 1 if (( request = request_headers['Cache-Control'] )) &&
98
+ request['no-cache'] ||
99
+ (!request['max-stale'] && request['max-age'] &&
100
+ (request['max-age']['token'].to_s == "0" || current_age > request['max-age']['token'].to_i))
101
+ end
90
102
 
91
103
  # source: https://tools.ietf.org/html/rfc7234#section-5.2.2.2
92
104
  # source: https://tools.ietf.org/html/rfc7234#section-3.2
@@ -8,9 +8,11 @@ class TestRegressions < MiniTest::Test
8
8
  def setup
9
9
  @cached_headers = {
10
10
  :cached => {
11
+ "Age" => "99999",
11
12
  "Date" => {"httpdate"=>"Thu, 01 Jan 2015 07:03:45 GMT", "timestamp"=>1420095825},
12
13
  "Cache-Control" => {
13
- "public" => {"token"=>nil, "quoted_string"=>nil}
14
+ "public" => {"token"=>nil, "quoted_string"=>nil},
15
+ "max-age" => {"token"=>"10", "quoted_string"=>nil}
14
16
  },
15
17
  "X-Cache-Req-Date" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625},
16
18
  "X-Cache-Res-Date" => {"httpdate"=>"Sat, 03 Jan 2015 07:03:45 GMT", "timestamp"=>1420268625}
@@ -44,4 +46,24 @@ class TestRegressions < MiniTest::Test
44
46
  assert_equal isnil, []
45
47
  assert_equal isempty, []
46
48
  end
49
+
50
+ # https://github.com/aw/CacheRules/issues/10
51
+ def test_bugfix_10_request_header_max_age_is_checked
52
+ request_maxage = CacheRules.validate_no_cache?({
53
+ :cached => @cached_headers[:cached],
54
+ :request => {"Cache-Control" => {"max-age" => {"token"=>0, "quoted_string"=>nil} } }
55
+ })
56
+ current = CacheRules.validate_no_cache?({
57
+ :cached => @cached_headers[:cached],
58
+ :request => {"Cache-Control" => {"max-age" => {"token"=>1000, "quoted_string"=>nil} } }
59
+ })
60
+ cached_max_age = CacheRules.validate_expired?({
61
+ :cached => @cached_headers[:cached],
62
+ :request => {}
63
+ })
64
+
65
+ assert_equal 1, request_maxage
66
+ assert_equal 1, current
67
+ assert_equal 1, cached_max_age
68
+ end
47
69
  end
@@ -164,7 +164,7 @@ class TestValidations < MiniTest::Test
164
164
  def test_no_cache
165
165
  headers1 = {
166
166
  :request => {'Cache-Control' => {'no-cache'=>{'token'=>nil}}},
167
- :cached => {'Cache-Control' => {}}
167
+ :cached => {}
168
168
  }
169
169
  headers2 = {
170
170
  :request => {},
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.17
4
+ version: 0.1.18
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-30 00:00:00.000000000 Z
12
+ date: 2015-05-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fakeweb