ocean-rails 3.3.3 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ocean/api.rb +64 -30
- data/lib/ocean/api_remote_resource.rb +4 -2
- data/lib/ocean/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e35b6a26426816dec30071f7fd2c87272e4530d7
|
4
|
+
data.tar.gz: ac1e42b243d0985e4aba91f2b2939ec0e3b3d0c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00265cc72834b55c5c5c9e4e4d2f672dddd14ebbbd20baf65c9d28d2898138054d7fd9f08a36c5eacfdc025a04cda1f83373ffe0cda7306fd195cd6db8dde6f1
|
7
|
+
data.tar.gz: 191b0d669a58c0efcac288da5a6605f6d97fcbc62d89a650333f4083fec9da7938fe2b037412a1b20a28f4d2c03ec55582064ceb3855ac820ae71e118f064b9f
|
data/lib/ocean/api.rb
CHANGED
@@ -145,11 +145,25 @@ class Api
|
|
145
145
|
# +ssl_verifypeer+ (true by default), controls SSL peer verification.
|
146
146
|
# +ssl_verifyhost+ (2 by default), controls SSL host verification.
|
147
147
|
#
|
148
|
+
# Automatic retries for GET requests are available:
|
149
|
+
#
|
150
|
+
# +retries+, if given and > 0, specifies the number of retries to perform for GET requests.
|
151
|
+
# Defaults to 0, meaning no retries.
|
152
|
+
# +backoff_time+ (default 1) the initial time to wait between retries.
|
153
|
+
# +backoff_rate+ (default 0.9) the rate at which the time is increased.
|
154
|
+
# +backoff_max+ (default 30) the maximum time to wait between retries.
|
155
|
+
#
|
156
|
+
# The backoff time is increased after each wait period by the product of itself and
|
157
|
+
# backoff_rate. The backoff time is capped by backoff_max. The default time and rate
|
158
|
+
# settings will generate the progression 1, 1.9, 3.61, 6.859, 13.0321, 24.76099, etc.
|
159
|
+
# To disable waiting between retries, set +backoff_time+ to zero.
|
160
|
+
#
|
148
161
|
def self.request(url, http_method, args: nil, headers: {}, body: nil,
|
149
162
|
credentials: nil,
|
150
163
|
x_api_token: headers['X-API-Token'],
|
151
164
|
reauthentication: true,
|
152
|
-
ssl_verifypeer: true, ssl_verifyhost: 2
|
165
|
+
ssl_verifypeer: true, ssl_verifyhost: 2,
|
166
|
+
retries: 0, backoff_time: 1, backoff_rate: 0.9, backoff_max: 30)
|
153
167
|
# Set up the request
|
154
168
|
headers['Accept'] = "application/json"
|
155
169
|
headers['Content-Type'] = "application/json" if [:post, :put].include?(http_method)
|
@@ -157,39 +171,59 @@ class Api
|
|
157
171
|
x_api_token = Api.authenticate(*Api.decode_credentials(credentials)) if x_api_token.blank? && credentials.present?
|
158
172
|
headers['X-API-Token'] = x_api_token if x_api_token.present?
|
159
173
|
|
174
|
+
response = nil
|
175
|
+
tries_done = 0
|
176
|
+
max_tries = [:get, "GET", "get"].include?(http_method) ? retries + 1 : 1
|
160
177
|
while (true) do
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
#
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
if credentials
|
182
|
-
x_api_token = Api.authenticate(*Api.decode_credentials(credentials))
|
183
|
-
headers['X-API-Token'] = x_api_token
|
178
|
+
tries_done += 1
|
179
|
+
last_try = tries_done >= max_tries
|
180
|
+
|
181
|
+
while (true) do
|
182
|
+
request = Typhoeus::Request.new(url,
|
183
|
+
method: http_method,
|
184
|
+
headers: headers,
|
185
|
+
params: args,
|
186
|
+
body: body,
|
187
|
+
ssl_verifypeer: ssl_verifypeer,
|
188
|
+
ssl_verifyhost: ssl_verifyhost)
|
189
|
+
# Run it
|
190
|
+
response = Response.new(request.run)
|
191
|
+
# If successful, return
|
192
|
+
return response if response.success?
|
193
|
+
|
194
|
+
# Not successful, deal with it
|
195
|
+
if last_try
|
196
|
+
raise Api::TimeoutError, "Api.request timed out" if response.timed_out?
|
197
|
+
raise Api::NoResponseError, "Api.request could not obtain a response" if response.status == 0
|
184
198
|
else
|
185
|
-
|
186
|
-
|
199
|
+
break if response.timed_out?
|
200
|
+
break if response.status == 0
|
187
201
|
end
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
202
|
+
|
203
|
+
# Reauthenticate if necessary
|
204
|
+
if [400, 419].include?(response.status) && reauthentication && x_api_token.present?
|
205
|
+
# Re-authenticate and retry
|
206
|
+
if credentials
|
207
|
+
x_api_token = Api.authenticate(*Api.decode_credentials(credentials))
|
208
|
+
headers['X-API-Token'] = x_api_token
|
209
|
+
else
|
210
|
+
Api.reset_service_token
|
211
|
+
headers['X-API-Token'] = Api.service_token
|
212
|
+
end
|
213
|
+
reauthentication = false # This prevents us from ending up here twice
|
214
|
+
elsif (400..499).include?(response.status)
|
215
|
+
return response
|
216
|
+
else
|
217
|
+
# Retry on 500s (will we ever get 300s?)
|
218
|
+
break
|
219
|
+
end
|
220
|
+
|
192
221
|
end
|
222
|
+
# Retry
|
223
|
+
break if last_try
|
224
|
+
sleep backoff_time
|
225
|
+
seconds = [backoff_time + backoff_time * backoff_rate, 30].min
|
226
|
+
backoff_time = seconds
|
193
227
|
end
|
194
228
|
# Return the wrapped response to the failed request
|
195
229
|
response
|
@@ -86,7 +86,7 @@ class Api
|
|
86
86
|
|
87
87
|
def initialize(uri, type="application/json",
|
88
88
|
credentials: nil, x_api_token: nil,
|
89
|
-
retries: 3, backoff_time: 1, backoff_rate:
|
89
|
+
retries: 3, backoff_time: 1, backoff_rate: 0.9, backoff_max: 30)
|
90
90
|
super()
|
91
91
|
@uri = uri
|
92
92
|
@content_type = type
|
@@ -171,7 +171,9 @@ class Api
|
|
171
171
|
credentials = nil
|
172
172
|
token = rr.x_api_token || Api.service_token
|
173
173
|
end
|
174
|
-
response = Api.request rr.uri, :get, headers: {}, credentials: credentials, x_api_token: token
|
174
|
+
response = Api.request rr.uri, :get, headers: {}, credentials: credentials, x_api_token: token,
|
175
|
+
retries: rr.retries, backoff_time: rr.backoff_time, backoff_rate: rr.backoff_rate,
|
176
|
+
backoff_max: rr.backoff_max
|
175
177
|
rr.send :status=, response.status
|
176
178
|
rr.send :status_message=, response.message
|
177
179
|
rr.send :headers=, response.headers
|
data/lib/ocean/version.rb
CHANGED