ddy_remote_resource 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/lib/remote_resource/request.rb +32 -19
- data/lib/remote_resource/response.rb +4 -0
- data/lib/remote_resource/version.rb +1 -1
- data/remote_resource.gemspec +2 -2
- data/spec/lib/remote_resource/request_spec.rb +43 -6
- data/spec/lib/remote_resource/version_spec.rb +1 -1
- metadata +12 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0032d56e8df7f6e90e146abb65b29a41a59a63e39747c6b0b7585c02f577069
|
4
|
+
data.tar.gz: 4454b9226626e5a2028dc871c83d15347da8a373d104e641810c3f002e8e94c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 327330942d08e782894d10b46be1c6a6fc560f4cab2a4f7bb77a2b2958853ad929a024ccc00c560a3672e48c55a5844e9064e9c7fc00ae9839228d904038f2b6
|
7
|
+
data.tar.gz: f6d6b6c025c695cd68f4697b9a001046d54a29b32f51aabbec187ff9359bf32da6db83510cc5a3a251729159100e06b11054986a009d55386ece26e5f372ed8b
|
data/.gitignore
CHANGED
@@ -14,6 +14,9 @@ module RemoteResource
|
|
14
14
|
|
15
15
|
DEFAULT_EXTENSION = '.json'.freeze
|
16
16
|
|
17
|
+
DEFAULT_CONNECT_TIMEOUT = 30
|
18
|
+
DEFAULT_READ_TIMEOUT = 120
|
19
|
+
|
17
20
|
attr_reader :resource, :resource_klass, :http_action, :attributes
|
18
21
|
|
19
22
|
def initialize(resource, http_action, attributes = {}, connection_options = {})
|
@@ -41,7 +44,7 @@ module RemoteResource
|
|
41
44
|
def perform
|
42
45
|
SUPPORTED_HTTP_METHODS.include?(http_action) || raise(RemoteResource::HTTPMethodUnsupported, "Requested HTTP method=#{http_action.to_s} is NOT supported, the HTTP action MUST be a supported HTTP action=#{SUPPORTED_HTTP_METHODS.join(', ')}")
|
43
46
|
|
44
|
-
connection_response = connection.public_send(http_action, request_url, params: query, body: body, headers: headers)
|
47
|
+
connection_response = connection.public_send(http_action, request_url, params: query, body: body, headers: headers, **timeout_options)
|
45
48
|
response = RemoteResource::Response.new(connection_response, connection_options.merge(request: self, connection_request: connection_response.request))
|
46
49
|
|
47
50
|
if response.success? || response.unprocessable_entity?
|
@@ -118,47 +121,57 @@ module RemoteResource
|
|
118
121
|
headers
|
119
122
|
end
|
120
123
|
|
124
|
+
def timeout_options
|
125
|
+
connecttimeout = connection_options[:connecttimeout].presence || DEFAULT_CONNECT_TIMEOUT
|
126
|
+
timeout = connection_options[:timeout].presence || DEFAULT_READ_TIMEOUT
|
127
|
+
|
128
|
+
{ connecttimeout: connecttimeout, timeout: timeout }
|
129
|
+
end
|
130
|
+
|
121
131
|
private
|
122
132
|
|
123
133
|
def raise_http_error(request, response)
|
134
|
+
# Special case if a request has a time out, as Typhoeus does not set a 408 response_code
|
135
|
+
raise RemoteResource::HTTPRequestTimeout.new(request, response) if response.timed_out?
|
136
|
+
|
124
137
|
case response.try(:response_code)
|
125
138
|
when 301, 302, 303, 307 then
|
126
139
|
raise RemoteResource::HTTPRedirectionError.new(request, response)
|
127
|
-
when 400
|
140
|
+
when 400
|
128
141
|
raise RemoteResource::HTTPBadRequest.new(request, response)
|
129
|
-
when 401
|
142
|
+
when 401
|
130
143
|
raise RemoteResource::HTTPUnauthorized.new(request, response)
|
131
|
-
when 403
|
144
|
+
when 403
|
132
145
|
raise RemoteResource::HTTPForbidden.new(request, response)
|
133
|
-
when 404
|
146
|
+
when 404
|
134
147
|
raise RemoteResource::HTTPNotFound.new(request, response)
|
135
|
-
when 405
|
148
|
+
when 405
|
136
149
|
raise RemoteResource::HTTPMethodNotAllowed.new(request, response)
|
137
|
-
when 406
|
150
|
+
when 406
|
138
151
|
raise RemoteResource::HTTPNotAcceptable.new(request, response)
|
139
|
-
when 408
|
152
|
+
when 408
|
140
153
|
raise RemoteResource::HTTPRequestTimeout.new(request, response)
|
141
|
-
when 409
|
154
|
+
when 409
|
142
155
|
raise RemoteResource::HTTPConflict.new(request, response)
|
143
|
-
when 410
|
156
|
+
when 410
|
144
157
|
raise RemoteResource::HTTPGone.new(request, response)
|
145
|
-
when 418
|
158
|
+
when 418
|
146
159
|
raise RemoteResource::HTTPTeapot.new(request, response)
|
147
|
-
when 444
|
160
|
+
when 444
|
148
161
|
raise RemoteResource::HTTPNoResponse.new(request, response)
|
149
|
-
when 494
|
162
|
+
when 494
|
150
163
|
raise RemoteResource::HTTPRequestHeaderTooLarge.new(request, response)
|
151
|
-
when 495
|
164
|
+
when 495
|
152
165
|
raise RemoteResource::HTTPCertError.new(request, response)
|
153
|
-
when 496
|
166
|
+
when 496
|
154
167
|
raise RemoteResource::HTTPNoCert.new(request, response)
|
155
|
-
when 497
|
168
|
+
when 497
|
156
169
|
raise RemoteResource::HTTPToHTTPS.new(request, response)
|
157
|
-
when 499
|
170
|
+
when 499
|
158
171
|
raise RemoteResource::HTTPClientClosedRequest.new(request, response)
|
159
|
-
when 400..499
|
172
|
+
when 400..499
|
160
173
|
raise RemoteResource::HTTPClientError.new(request, response)
|
161
|
-
when 500..599
|
174
|
+
when 500..599
|
162
175
|
raise RemoteResource::HTTPServerError.new(request, response)
|
163
176
|
else
|
164
177
|
raise RemoteResource::HTTPError.new(request, response)
|
data/remote_resource.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'remote_resource/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'ddy_remote_resource'
|
8
8
|
spec.version = RemoteResource::VERSION
|
9
|
-
spec.authors = ['Jan van der Pas']
|
10
|
-
spec.email = ['
|
9
|
+
spec.authors = ['Digidentity', 'Jan van der Pas']
|
10
|
+
spec.email = ['development@digidentity.com']
|
11
11
|
spec.summary = %q{RemoteResource, a gem to use resources with REST services.}
|
12
12
|
spec.description = %q{RemoteResource, a gem to use resources with REST services. A replacement for ActiveResource gem.}
|
13
13
|
spec.homepage = ''
|
@@ -168,7 +168,9 @@ RSpec.describe RemoteResource::Request do
|
|
168
168
|
let(:expected_connection_options) { request.connection_options }
|
169
169
|
|
170
170
|
it 'makes a GET request with the connection_options[:params] as query' do
|
171
|
-
expect(connection).to receive(:get).with(expected_request_url, params: expected_params,
|
171
|
+
expect(connection).to receive(:get).with(expected_request_url, params: expected_params,
|
172
|
+
body: expected_body, headers: expected_headers,
|
173
|
+
connecttimeout: 30, timeout: 120).and_call_original
|
172
174
|
request.perform
|
173
175
|
end
|
174
176
|
|
@@ -191,7 +193,9 @@ RSpec.describe RemoteResource::Request do
|
|
191
193
|
let(:expected_connection_options) { request.connection_options }
|
192
194
|
|
193
195
|
it 'makes a PUT request with the attributes as body' do
|
194
|
-
expect(connection).to receive(:put).with(expected_request_url, params: expected_params,
|
196
|
+
expect(connection).to receive(:put).with(expected_request_url, params: expected_params,
|
197
|
+
body: expected_body, headers: expected_headers,
|
198
|
+
connecttimeout: 30, timeout: 120).and_call_original
|
195
199
|
request.perform
|
196
200
|
end
|
197
201
|
|
@@ -214,7 +218,9 @@ RSpec.describe RemoteResource::Request do
|
|
214
218
|
let(:expected_connection_options) { request.connection_options }
|
215
219
|
|
216
220
|
it 'makes a PATCH request with the attributes as body' do
|
217
|
-
expect(connection).to receive(:patch).with(expected_request_url, params: expected_params,
|
221
|
+
expect(connection).to receive(:patch).with(expected_request_url, params: expected_params,
|
222
|
+
body: expected_body, headers: expected_headers,
|
223
|
+
connecttimeout: 30, timeout: 120).and_call_original
|
218
224
|
request.perform
|
219
225
|
end
|
220
226
|
|
@@ -237,7 +243,9 @@ RSpec.describe RemoteResource::Request do
|
|
237
243
|
let(:expected_connection_options) { request.connection_options }
|
238
244
|
|
239
245
|
it 'makes a POST request with the attributes as body' do
|
240
|
-
expect(connection).to receive(:post).with(expected_request_url, params: expected_params,
|
246
|
+
expect(connection).to receive(:post).with(expected_request_url, params: expected_params,
|
247
|
+
body: expected_body, headers: expected_headers,
|
248
|
+
connecttimeout: 30, timeout: 120).and_call_original
|
241
249
|
request.perform
|
242
250
|
end
|
243
251
|
|
@@ -260,7 +268,9 @@ RSpec.describe RemoteResource::Request do
|
|
260
268
|
let(:expected_connection_options) { request.connection_options }
|
261
269
|
|
262
270
|
it 'makes a DELETE request with the connection_options[:params] as query' do
|
263
|
-
expect(connection).to receive(:delete).with(expected_request_url, params: expected_params,
|
271
|
+
expect(connection).to receive(:delete).with(expected_request_url, params: expected_params,
|
272
|
+
body: expected_body, headers: expected_headers,
|
273
|
+
connecttimeout: 30, timeout: 120).and_call_original
|
264
274
|
request.perform
|
265
275
|
end
|
266
276
|
|
@@ -586,10 +596,37 @@ RSpec.describe RemoteResource::Request do
|
|
586
596
|
end
|
587
597
|
end
|
588
598
|
|
599
|
+
describe '#timeout_options' do
|
600
|
+
it 'is not given by default' do
|
601
|
+
expect(request.connection_options).not_to include :connecttimeout, :timeout
|
602
|
+
end
|
603
|
+
|
604
|
+
context 'with custom timeouts' do
|
605
|
+
let(:connection_options) do
|
606
|
+
{ connecttimeout: 1, timeout: 2 }
|
607
|
+
end
|
608
|
+
|
609
|
+
it 'sets the timeouts from connection_options' do
|
610
|
+
aggregate_failures do
|
611
|
+
expect(request.connection_options[:connecttimeout]).to eq 1
|
612
|
+
expect(request.connection_options[:timeout]).to eq 2
|
613
|
+
end
|
614
|
+
end
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
589
618
|
describe '#raise_http_error' do
|
590
|
-
let(:connection_response) { instance_double(Typhoeus::Response, request: instance_double(Typhoeus::Request)) }
|
619
|
+
let(:connection_response) { instance_double(Typhoeus::Response, request: instance_double(Typhoeus::Request), timed_out?: false) }
|
591
620
|
let(:response) { RemoteResource::Response.new(connection_response, connection_options) }
|
592
621
|
|
622
|
+
context 'when the response has timed out' do
|
623
|
+
let(:connection_response) { instance_double(Typhoeus::Response, request: instance_double(Typhoeus::Request), timed_out?: true) }
|
624
|
+
|
625
|
+
it 'raises a RemoteResource::HTTPRequestTimeout' do
|
626
|
+
expect { request.send(:raise_http_error, request, response) }.to raise_error RemoteResource::HTTPRequestTimeout
|
627
|
+
end
|
628
|
+
end
|
629
|
+
|
593
630
|
context 'when the response code is 301, 302, 303 or 307' do
|
594
631
|
response_codes = [301, 302, 303, 307]
|
595
632
|
response_codes.each do |response_code|
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddy_remote_resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Digidentity
|
7
8
|
- Jan van der Pas
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2021-01-08 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
@@ -206,22 +207,22 @@ dependencies:
|
|
206
207
|
name: typhoeus
|
207
208
|
requirement: !ruby/object:Gem::Requirement
|
208
209
|
requirements:
|
209
|
-
- - ">="
|
210
|
-
- !ruby/object:Gem::Version
|
211
|
-
version: 0.7.0
|
212
210
|
- - "~>"
|
213
211
|
- !ruby/object:Gem::Version
|
214
212
|
version: '0.7'
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 0.7.0
|
215
216
|
type: :runtime
|
216
217
|
prerelease: false
|
217
218
|
version_requirements: !ruby/object:Gem::Requirement
|
218
219
|
requirements:
|
219
|
-
- - ">="
|
220
|
-
- !ruby/object:Gem::Version
|
221
|
-
version: 0.7.0
|
222
220
|
- - "~>"
|
223
221
|
- !ruby/object:Gem::Version
|
224
222
|
version: '0.7'
|
223
|
+
- - ">="
|
224
|
+
- !ruby/object:Gem::Version
|
225
|
+
version: 0.7.0
|
225
226
|
- !ruby/object:Gem::Dependency
|
226
227
|
name: request_store
|
227
228
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,7 +240,7 @@ dependencies:
|
|
239
240
|
description: RemoteResource, a gem to use resources with REST services. A replacement
|
240
241
|
for ActiveResource gem.
|
241
242
|
email:
|
242
|
-
-
|
243
|
+
- development@digidentity.com
|
243
244
|
executables: []
|
244
245
|
extensions: []
|
245
246
|
extra_rdoc_files: []
|
@@ -319,7 +320,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
319
320
|
- !ruby/object:Gem::Version
|
320
321
|
version: '0'
|
321
322
|
requirements: []
|
322
|
-
|
323
|
+
rubyforge_project:
|
324
|
+
rubygems_version: 2.7.6
|
323
325
|
signing_key:
|
324
326
|
specification_version: 4
|
325
327
|
summary: RemoteResource, a gem to use resources with REST services.
|