resterl 0.0.12 → 0.0.13
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 +15 -0
- data/lib/resterl/caches/cache_interface.rb +15 -9
- data/lib/resterl/client.rb +109 -102
- data/lib/resterl/version.rb +1 -1
- metadata +7 -16
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NTEyZGFhZmRlNTc1ZTQxZmVhODliZTYxNjkzYTExMDA2OGFhYzExNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTBiY2I0NTJlNzFhZjcxZGMxYTA0Nzc3ODZjYzQ3MTQxNjA3OTNhYg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MDRiOWMwYTgyNWU2MWUyOTEwZDRjYjgwMjhjNmRkNThhZmMzZTY0MWNlYzE5
|
10
|
+
ZjkwODhhOGRhOTQyMmIwYjU3OTJiYzAzYzgxODE4ZjRkOGM3MzE5ZmRmNmFj
|
11
|
+
Yzg0MTcwNTZlNDBkZmEyZmExMmI0NDMxNzI0YjRlOGIzYTY2OGQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZmYxOTg1NWYwZGY2OGI2MTE4ZGYzNjE4NTNjZmU0ODU1M2YwZGRhYzZkMDA5
|
14
|
+
MTQ2ZGNkM2IwZGEzZTgzZTk4ZjkyZTQ4Nzk5MGQyMDVlNzc5MWNlYTU0MzRm
|
15
|
+
NTBkZGVjMTY1NzBhZDRkNzJlNThiMjE5ZGJkYTBiZDFhYmI0YzQ=
|
@@ -1,11 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
module Resterl
|
2
|
+
module Caches
|
3
|
+
class CacheInterface
|
4
|
+
def read key
|
5
|
+
raise 'Not yet implemented!'
|
6
|
+
end
|
7
|
+
|
8
|
+
def write key, value, expires_in
|
9
|
+
raise 'Not yet implemented!'
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete key
|
13
|
+
raise 'Not yet implemented!'
|
14
|
+
end
|
15
|
+
end
|
10
16
|
end
|
11
17
|
end
|
data/lib/resterl/client.rb
CHANGED
@@ -1,120 +1,127 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Resterl
|
4
|
+
class Client
|
5
|
+
attr_reader :options
|
6
|
+
DEFAULTS = {
|
7
|
+
max_redirect_depth: 10,
|
8
|
+
cache: Resterl::Caches::SimpleCache.new,
|
9
|
+
ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE,
|
10
|
+
expiry_multiplier: 10,
|
11
|
+
minimum_cache_lifetime: 5 * 60 # 5 Minuten
|
12
|
+
}
|
13
|
+
|
14
|
+
class TooManyRedirects < StandardError; end
|
15
|
+
|
16
|
+
def initialize(options = {})
|
17
|
+
@options = DEFAULTS.merge(options).freeze
|
18
|
+
@cache = @options[:cache]
|
19
|
+
end
|
17
20
|
|
18
|
-
|
19
|
-
|
21
|
+
def get url, params, headers
|
22
|
+
url = setup_url(url)
|
20
23
|
|
21
|
-
|
22
|
-
|
24
|
+
# Cache-Schlüssel aus Pfad hashen
|
25
|
+
cache_key = data_to_cache_key url, params, headers
|
23
26
|
|
24
|
-
|
25
|
-
|
27
|
+
# Response aus Cache holen
|
28
|
+
old_response = @cache.read(cache_key)
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
if old_response && !old_response.expired?
|
31
|
+
# Anfrage noch nicht abgelaufen, Ergebnis aus dem Cache verwenden
|
32
|
+
old_response
|
33
|
+
else
|
34
|
+
# Neue Anfrage
|
35
|
+
new_get_request url, cache_key, params, headers, old_response
|
36
|
+
end
|
33
37
|
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def post url, params, data, headers
|
37
|
-
# Caching nicht notwendig
|
38
|
-
url = setup_url url
|
39
|
-
request = Resterl::PostRequest.new(self, url, params, data, headers)
|
40
|
-
response = request.perform.response
|
41
|
-
|
42
|
-
response
|
43
|
-
end
|
44
|
-
|
45
|
-
def put url, params, data, headers
|
46
|
-
# TODO: Testen, durchdenken, refactoring?
|
47
|
-
url = setup_url url
|
48
|
-
request = Resterl::PutRequest.new(self, url, params, data, headers)
|
49
|
-
request.perform.response
|
50
|
-
end
|
51
|
-
|
52
|
-
def delete url, params, data, headers
|
53
|
-
# TODO: Testen, durchdenken, refactoring?
|
54
|
-
url = setup_url url
|
55
|
-
request = Resterl::DeleteRequest.new(self, url, params, data, headers)
|
56
|
-
request.perform.response
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
38
|
|
61
|
-
|
39
|
+
def post url, params, data, headers
|
40
|
+
# Caching nicht notwendig
|
41
|
+
url = setup_url url
|
42
|
+
request = Resterl::PostRequest.new(self, url, params, data, headers)
|
43
|
+
response = request.perform.response
|
62
44
|
|
63
|
-
|
64
|
-
if old_response
|
65
|
-
etag = old_response.net_http_response['ETag']
|
66
|
-
headers['If-None-Match'] = etag if etag
|
67
|
-
|
68
|
-
last_modified = old_response.net_http_response['Last-Modified']
|
69
|
-
headers['If-Modified-Since'] = last_modified if last_modified
|
45
|
+
response
|
70
46
|
end
|
71
47
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
when Net::HTTPClientError, Net::HTTPServerError
|
79
|
-
# Aus dem Cache muss nichts entfernt werden, weil ja auch kein Eintrag
|
80
|
-
# (mehr) drin ist.
|
81
|
-
new_response.error!
|
82
|
-
when Net::HTTPNotModified
|
83
|
-
# Wenn "304 Not Modified", dann altes Ergebnis als neues Ergebnis
|
84
|
-
# verwenden
|
85
|
-
r_temp = Resterl::Response.new(new_response)
|
86
|
-
old_response.update_expires_at(r_temp.expires_at)
|
87
|
-
[old_response, r_temp.expires_at - Time.now]
|
88
|
-
|
89
|
-
when Net::HTTPSuccess
|
90
|
-
r = Resterl::Response.new(new_response)
|
91
|
-
[r, r.expires_at - Time.now]
|
92
|
-
else
|
93
|
-
raise 'unknown response'
|
48
|
+
def put url, params, data, headers
|
49
|
+
# TODO: Testen, durchdenken, refactoring?
|
50
|
+
url = setup_url url
|
51
|
+
request = Resterl::PutRequest.new(self, url, params, data, headers)
|
52
|
+
request.perform.response
|
94
53
|
end
|
95
54
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
55
|
+
def delete url, params, data, headers
|
56
|
+
# TODO: Testen, durchdenken, refactoring?
|
57
|
+
url = setup_url url
|
58
|
+
request = Resterl::DeleteRequest.new(self, url, params, data, headers)
|
59
|
+
request.perform.response
|
60
|
+
end
|
101
61
|
|
102
|
-
|
103
|
-
|
62
|
+
def invalidate url, params, headers
|
63
|
+
@cache.delete data_to_cache_key(url, params, headers)
|
64
|
+
end
|
104
65
|
|
105
|
-
|
106
|
-
|
66
|
+
private
|
67
|
+
|
68
|
+
def new_get_request url, cache_key, params, headers, old_response
|
69
|
+
# Ggf. ETag und Last-Modified auslesen
|
70
|
+
if old_response
|
71
|
+
etag = old_response.net_http_response['ETag']
|
72
|
+
headers['If-None-Match'] = etag if etag
|
73
|
+
|
74
|
+
last_modified = old_response.net_http_response['Last-Modified']
|
75
|
+
headers['If-Modified-Since'] = last_modified if last_modified
|
76
|
+
end
|
77
|
+
|
78
|
+
# Anfrage stellen, ggf. ETag mit übergeben
|
79
|
+
request = Resterl::GetRequest.new(self, url, params, headers)
|
80
|
+
new_response = request.perform.response
|
81
|
+
|
82
|
+
response, max_age_seconds = case new_response
|
83
|
+
when Net::HTTPClientError,
|
84
|
+
Net::HTTPServerError
|
85
|
+
# Aus dem Cache muss nichts entfernt werden,
|
86
|
+
# weil ja auch kein Eintrag (mehr) drin ist.
|
87
|
+
new_response.error!
|
88
|
+
when Net::HTTPNotModified
|
89
|
+
# Wenn "304 Not Modified", dann altes
|
90
|
+
# Ergebnis als neues Ergebnis verwenden
|
91
|
+
r_temp = Resterl::Response.new(new_response)
|
92
|
+
old_response.update_expires_at(
|
93
|
+
r_temp.expires_at)
|
94
|
+
[old_response, r_temp.expires_at - Time.now]
|
95
|
+
when Net::HTTPSuccess
|
96
|
+
r = Resterl::Response.new(new_response)
|
97
|
+
[r, r.expires_at - Time.now]
|
98
|
+
else
|
99
|
+
raise 'unknown response'
|
100
|
+
end
|
101
|
+
|
102
|
+
# Cachezeit berechnen
|
103
|
+
expiry = [
|
104
|
+
max_age_seconds.to_i * options[:expiry_multiplier],
|
105
|
+
options[:minimum_cache_lifetime]
|
106
|
+
].max
|
107
|
+
|
108
|
+
# Ergebnis im Cache speichern
|
109
|
+
@cache.write cache_key, response, expiry
|
110
|
+
|
111
|
+
response
|
112
|
+
end
|
107
113
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
+
def setup_url url
|
115
|
+
if url =~ /^http/
|
116
|
+
url
|
117
|
+
else
|
118
|
+
bu = options[:base_uri]
|
119
|
+
bu ? "#{bu}#{url}" : url
|
120
|
+
end
|
114
121
|
end
|
115
|
-
end
|
116
122
|
|
117
|
-
|
118
|
-
|
123
|
+
def data_to_cache_key *args
|
124
|
+
args.hash
|
125
|
+
end
|
119
126
|
end
|
120
127
|
end
|
data/lib/resterl/version.rb
CHANGED
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resterl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.13
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Florian Dütsch
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-10-02 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: hashie
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: yajl-ruby
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: shoulda
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -94,28 +87,26 @@ files:
|
|
94
87
|
- test/test_resterl.rb
|
95
88
|
homepage: http://github.com/Nix-wie-weg/resterl
|
96
89
|
licenses: []
|
90
|
+
metadata: {}
|
97
91
|
post_install_message:
|
98
92
|
rdoc_options: []
|
99
93
|
require_paths:
|
100
94
|
- lib
|
101
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
-
none: false
|
103
96
|
requirements:
|
104
97
|
- - ! '>='
|
105
98
|
- !ruby/object:Gem::Version
|
106
99
|
version: '0'
|
107
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
-
none: false
|
109
101
|
requirements:
|
110
102
|
- - ! '>='
|
111
103
|
- !ruby/object:Gem::Version
|
112
104
|
version: '0'
|
113
105
|
requirements: []
|
114
106
|
rubyforge_project:
|
115
|
-
rubygems_version:
|
107
|
+
rubygems_version: 2.2.2
|
116
108
|
signing_key:
|
117
|
-
specification_version:
|
109
|
+
specification_version: 4
|
118
110
|
summary: Rudimentary HTTP client with focus on caching
|
119
|
-
test_files:
|
120
|
-
|
121
|
-
- test/test_resterl.rb
|
111
|
+
test_files: []
|
112
|
+
has_rdoc:
|