ddy_remote_resource 1.1.2 → 1.2.0
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 +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.
|