faraday-http-cache 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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.