faraday-http-cache 0.2.0 → 0.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 03db6f441525313b0456fb22845a0273138a1c50
4
- data.tar.gz: 7ede80de69498baf306b98be866b37f3b04e4683
3
+ metadata.gz: 75eed5459ea58ad83130acdab34d7acf40967eaa
4
+ data.tar.gz: f5847df239db40584db36489818143e31d821222
5
5
  SHA512:
6
- metadata.gz: f3136959afbad718ce611169c3cf86f3721360c4b9bb44fca9db13fcca5e9013dc144a5a40f180ed904757c9e286c009bccd80672bb145fcde1769c84713acac
7
- data.tar.gz: 4c66329f3810782ac4a586cc69d94e14ad4e1353b4cba5da928b8230a9821593a4be2ba538c20c4bb37baff75849a9ce2f30be5c7299f0bb7b562fcaeeadc6f5
6
+ metadata.gz: f95af2c373abe3e7b3055c10fcd92b2208b01c3725da597e9b07d9e56c0ee477e7028852f883b6a7870f02ba8a65bcbd8c338e05a0b2535cd9093a63cfdc7682
7
+ data.tar.gz: 8abb220a303052b25b83c4e16f40c77c4dbc6e4bd87ee33e18be28d108fde5ef2600e2baf5f5802a37e30650a89f1e8f35c7d63ffc67799ce49b5b0dc961b89f
@@ -38,6 +38,17 @@ module Faraday
38
38
  @directives['max-age'].to_i if @directives.key?('max-age')
39
39
  end
40
40
 
41
+ # Internal: Gets the 'max-age' directive as an Integer.
42
+ #
43
+ # takes the age header integer value and reduces the max-age and s-maxage
44
+ # if present to account for having to remove static age header when caching responses
45
+ def normalize_max_ages(age)
46
+ if age > 0
47
+ @directives['max-age'] = @directives['max-age'].to_i - age if @directives.key?('max-age')
48
+ @directives['s-maxage'] = @directives['s-maxage'].to_i - age if @directives.key?('s-maxage')
49
+ end
50
+ end
51
+
41
52
  # Internal: Gets the 's-maxage' directive as an Integer.
42
53
  #
43
54
  # Returns nil if the 's-maxage' directive isn't present.
@@ -106,7 +106,7 @@ module Faraday
106
106
  def max_age
107
107
  cache_control.shared_max_age ||
108
108
  cache_control.max_age ||
109
- (expires && (expires - date))
109
+ (expires && (expires - @now))
110
110
  end
111
111
 
112
112
  # Internal: Creates a new 'Faraday::Response', merging the stored
@@ -123,6 +123,7 @@ module Faraday
123
123
  #
124
124
  # Returns a 'Hash'.
125
125
  def serializable_hash
126
+ prepare_to_cache
126
127
  @payload.slice(:status, :body, :response_headers)
127
128
  end
128
129
 
@@ -175,6 +176,19 @@ module Faraday
175
176
  def headers
176
177
  @payload[:response_headers]
177
178
  end
179
+
180
+ # Internal: prepares the response headers ready to be cached
181
+ #
182
+ # removes the age header if present to allow cached responses to continue aging while cached
183
+ # also normalizes the max age headers if age header provided to ensure accuracy once age header removed
184
+ def prepare_to_cache
185
+ if headers.key? 'Age'
186
+ cache_control.normalize_max_ages(headers['Age'].to_i)
187
+ headers.delete 'Age'
188
+ headers['Cache-Control'] = cache_control.to_s
189
+ end
190
+ end
191
+
178
192
  end
179
193
  end
180
194
  end
@@ -90,7 +90,8 @@ describe Faraday::HttpCache::Response do
90
90
  it "fallsback to the expiration date leftovers" do
91
91
  headers = { "Expires" => (Time.now + 100).httpdate, 'Date' => Time.now.httpdate }
92
92
  response = Faraday::HttpCache::Response.new(:response_headers => headers)
93
- response.max_age.should == 100
93
+ response.max_age.should < 100
94
+ response.max_age.should > 98
94
95
  end
95
96
 
96
97
  it "returns nil when there's no information to calculate the max age" do
@@ -152,4 +153,23 @@ describe Faraday::HttpCache::Response do
152
153
  response.body.should == "Hi!"
153
154
  end
154
155
  end
156
+
157
+ describe 'remove age before caching and normalize max-age if non-zero age present' do
158
+ it 'is fresh if the response still has some time to live' do
159
+ headers = {
160
+ 'Age' => 6,
161
+ 'Cache-Control' => 'public, max-age=40',
162
+ 'Date' => 38.seconds.ago.httpdate,
163
+ 'Expires' => 37.seconds.from_now.httpdate,
164
+ 'Last-Modified' => 300.seconds.ago.httpdate
165
+ }
166
+ response = Faraday::HttpCache::Response.new(:response_headers => headers)
167
+ response.should be_fresh
168
+
169
+ response.serializable_hash
170
+ response.max_age.should == 34
171
+ response.should_not be_fresh
172
+ end
173
+ end
174
+
155
175
  end
data/spec/storage_spec.rb CHANGED
@@ -38,4 +38,38 @@ describe Faraday::HttpCache::Storage do
38
38
  subject.read(request).should be_a(Faraday::HttpCache::Response)
39
39
  end
40
40
  end
41
+
42
+ describe 'remove age before caching and normalize max-age if non-zero age present' do
43
+ it 'is fresh if the response still has some time to live' do
44
+ headers = {
45
+ 'Age' => 6,
46
+ 'Cache-Control' => 'public, max-age=40',
47
+ 'Date' => 38.seconds.ago.httpdate,
48
+ 'Expires' => 37.seconds.from_now.httpdate,
49
+ 'Last-Modified' => 300.seconds.ago.httpdate
50
+ }
51
+ response = Faraday::HttpCache::Response.new(:response_headers => headers)
52
+ response.should be_fresh
53
+ subject.write(request, response)
54
+
55
+ cached_response = subject.read(request)
56
+ cached_response.max_age.should == 34
57
+ cached_response.should_not be_fresh
58
+ end
59
+
60
+ it 'is fresh until cached and that 1 second elapses then the response is no longer fresh' do
61
+ headers = {
62
+ 'Date' => 39.seconds.ago.httpdate,
63
+ 'Expires' => 40.seconds.from_now.httpdate,
64
+ }
65
+ response = Faraday::HttpCache::Response.new(:response_headers => headers)
66
+ response.should be_fresh
67
+ subject.write(request, response)
68
+
69
+ sleep(1)
70
+ cached_response = subject.read(request)
71
+ cached_response.should_not be_fresh
72
+ end
73
+ end
74
+
41
75
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday-http-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Mazza
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-03 00:00:00.000000000 Z
11
+ date: 2013-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  version: '0'
94
94
  requirements: []
95
95
  rubyforge_project:
96
- rubygems_version: 2.0.0
96
+ rubygems_version: 2.0.2
97
97
  signing_key:
98
98
  specification_version: 4
99
99
  summary: A Faraday middleware that stores and validates cache expiration.