restify 1.13.0 → 1.15.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +98 -6
  3. data/lib/restify/adapter/em.rb +6 -13
  4. data/lib/restify/adapter/pooled_em.rb +35 -40
  5. data/lib/restify/adapter/typhoeus.rb +57 -51
  6. data/lib/restify/context.rb +5 -9
  7. data/lib/restify/error.rb +24 -0
  8. data/lib/restify/global.rb +1 -0
  9. data/lib/restify/logging.rb +1 -1
  10. data/lib/restify/processors/base/parsing.rb +5 -9
  11. data/lib/restify/processors/base.rb +2 -6
  12. data/lib/restify/promise.rb +1 -3
  13. data/lib/restify/request.rb +13 -5
  14. data/lib/restify/resource.rb +2 -2
  15. data/lib/restify/response.rb +0 -2
  16. data/lib/restify/timeout.rb +1 -3
  17. data/lib/restify/version.rb +3 -3
  18. data/spec/restify/cache_spec.rb +2 -2
  19. data/spec/restify/context_spec.rb +10 -7
  20. data/spec/restify/error_spec.rb +10 -0
  21. data/spec/restify/features/head_requests_spec.rb +7 -7
  22. data/spec/restify/features/request_bodies_spec.rb +84 -0
  23. data/spec/restify/features/request_errors_spec.rb +19 -0
  24. data/spec/restify/features/request_headers_spec.rb +16 -17
  25. data/spec/restify/features/response_errors_spec.rb +127 -0
  26. data/spec/restify/global_spec.rb +6 -6
  27. data/spec/restify/link_spec.rb +9 -9
  28. data/spec/restify/processors/base_spec.rb +1 -0
  29. data/spec/restify/processors/json_spec.rb +2 -1
  30. data/spec/restify/processors/msgpack_spec.rb +8 -7
  31. data/spec/restify/promise_spec.rb +8 -4
  32. data/spec/restify/registry_spec.rb +2 -2
  33. data/spec/restify/relation_spec.rb +18 -17
  34. data/spec/restify/resource_spec.rb +9 -8
  35. data/spec/restify/timeout_spec.rb +4 -4
  36. data/spec/restify_spec.rb +52 -57
  37. data/spec/spec_helper.rb +11 -8
  38. data/spec/support/stub_server.rb +106 -0
  39. metadata +30 -23
  40. data/spec/restify/features/response_errors.rb +0 -79
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'puma'
4
+ require 'rack'
5
+ require 'webmock'
6
+ require 'webmock/rspec/matchers'
7
+
8
+ module Stub
9
+ # This Rack application matches the request received from rack against the
10
+ # webmock stub database and returns the response.
11
+ #
12
+ # A custom server name is used to
13
+ # 1) has a stable name without a dynamic port for easier `#stub_request`
14
+ # calls, and
15
+ # 2) to ensure no actual request is intercepted (they are send to
16
+ # `localhost:<port>`).
17
+ #
18
+ # If no stub is found a special HTTP 599 error code will be returned.
19
+ class Handler
20
+ def call(env)
21
+ signature = WebMock::RequestSignature.new(
22
+ env['REQUEST_METHOD'].downcase,
23
+ "http://stubserver#{env['REQUEST_URI']}",
24
+ )
25
+
26
+ # Extract request headers from rack env. Most header should start with
27
+ # `HTTP_` but at least content type is present as `CONTENT_TYPE`.
28
+ headers = {}
29
+ env.each_pair do |key, value|
30
+ case key
31
+ when /^HTTP_(.*)$/, /^(CONTENT_.*)$/
32
+ headers[Regexp.last_match(1)] = value
33
+ end
34
+ end
35
+
36
+ # Read request body from socket into string
37
+ signature.body = env['rack.input'].read
38
+ signature.headers = headers
39
+
40
+ WebMock::RequestRegistry.instance.requested_signatures.put(signature)
41
+ response = ::WebMock::StubRegistry.instance.response_for_request(signature)
42
+
43
+ # Return special HTTP 599 with the error message that would normally
44
+ # appear on missing stubs.
45
+ unless response
46
+ return [599, {}, [WebMock::NetConnectNotAllowedError.new(signature).message]]
47
+ end
48
+
49
+ if response.should_timeout
50
+ sleep 10
51
+ return [599, {}, ['Timeout']]
52
+ end
53
+
54
+ status = response.status
55
+ status = status.to_s.split(' ', 2) unless status.is_a?(Array)
56
+ status = Integer(status[0])
57
+
58
+ [status, response.headers || {}, [response.body.to_s]]
59
+ end
60
+ end
61
+
62
+ class Exception < ::StandardError; end
63
+
64
+ # Inject into base adapter to have HTTP 599 (missing stub) error raised as an
65
+ # extra exception, not just a server error.
66
+ module Patch
67
+ def call(request)
68
+ super.then do |response|
69
+ next response unless response.code == 599
70
+
71
+ raise ::Stub::Exception.new(response.body)
72
+ end
73
+ end
74
+
75
+ ::Restify::Adapter::Base.prepend(self)
76
+ end
77
+
78
+ class << self
79
+ def start_server!
80
+ @server = ::Puma::Server.new(Handler.new)
81
+ @server.add_tcp_listener('localhost', 9292)
82
+
83
+ Thread.new do
84
+ @server.run
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ RSpec.configure do |config|
91
+ config.include WebMock::API
92
+ config.include WebMock::Matchers
93
+
94
+ config.before(:suite) do
95
+ Stub.start_server!
96
+
97
+ # Net::HTTP adapter must be enabled, otherwise webmock fails to create mock
98
+ # responses from raw strings.
99
+ WebMock.disable!(except: %i[net_http])
100
+ end
101
+
102
+ config.around do |example|
103
+ example.run
104
+ WebMock.reset!
105
+ end
106
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restify
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.13.0
4
+ version: 1.15.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-12 00:00:00.000000000 Z
11
+ date: 2021-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -73,7 +73,7 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '5.0'
75
75
  - !ruby/object:Gem::Dependency
76
- name: rack
76
+ name: hitimes
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
@@ -86,20 +86,6 @@ dependencies:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
- - !ruby/object:Gem::Dependency
90
- name: typhoeus
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '1.3'
96
- type: :runtime
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '1.3'
103
89
  - !ruby/object:Gem::Dependency
104
90
  name: logging
105
91
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +115,7 @@ dependencies:
129
115
  - !ruby/object:Gem::Version
130
116
  version: '1.2'
131
117
  - !ruby/object:Gem::Dependency
132
- name: hitimes
118
+ name: rack
133
119
  requirement: !ruby/object:Gem::Requirement
134
120
  requirements:
135
121
  - - ">="
@@ -142,6 +128,20 @@ dependencies:
142
128
  - - ">="
143
129
  - !ruby/object:Gem::Version
144
130
  version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: typhoeus
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.3'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '1.3'
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: bundler
147
147
  requirement: !ruby/object:Gem::Requirement
@@ -194,8 +194,10 @@ files:
194
194
  - spec/restify/context_spec.rb
195
195
  - spec/restify/error_spec.rb
196
196
  - spec/restify/features/head_requests_spec.rb
197
+ - spec/restify/features/request_bodies_spec.rb
198
+ - spec/restify/features/request_errors_spec.rb
197
199
  - spec/restify/features/request_headers_spec.rb
198
- - spec/restify/features/response_errors.rb
200
+ - spec/restify/features/response_errors_spec.rb
199
201
  - spec/restify/global_spec.rb
200
202
  - spec/restify/link_spec.rb
201
203
  - spec/restify/processors/base_spec.rb
@@ -208,10 +210,12 @@ files:
208
210
  - spec/restify/timeout_spec.rb
209
211
  - spec/restify_spec.rb
210
212
  - spec/spec_helper.rb
213
+ - spec/support/stub_server.rb
211
214
  homepage: https://github.com/jgraichen/restify
212
215
  licenses:
213
216
  - LGPL-3.0+
214
- metadata: {}
217
+ metadata:
218
+ rubygems_mfa_required: 'true'
215
219
  post_install_message:
216
220
  rdoc_options: []
217
221
  require_paths:
@@ -220,14 +224,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
220
224
  requirements:
221
225
  - - ">="
222
226
  - !ruby/object:Gem::Version
223
- version: '0'
227
+ version: 2.5.0
224
228
  required_rubygems_version: !ruby/object:Gem::Requirement
225
229
  requirements:
226
230
  - - ">="
227
231
  - !ruby/object:Gem::Version
228
232
  version: '0'
229
233
  requirements: []
230
- rubygems_version: 3.1.2
234
+ rubygems_version: 3.1.6
231
235
  signing_key:
232
236
  specification_version: 4
233
237
  summary: An experimental hypermedia REST client.
@@ -236,8 +240,10 @@ test_files:
236
240
  - spec/restify/context_spec.rb
237
241
  - spec/restify/error_spec.rb
238
242
  - spec/restify/features/head_requests_spec.rb
243
+ - spec/restify/features/request_bodies_spec.rb
244
+ - spec/restify/features/request_errors_spec.rb
239
245
  - spec/restify/features/request_headers_spec.rb
240
- - spec/restify/features/response_errors.rb
246
+ - spec/restify/features/response_errors_spec.rb
241
247
  - spec/restify/global_spec.rb
242
248
  - spec/restify/link_spec.rb
243
249
  - spec/restify/processors/base_spec.rb
@@ -250,3 +256,4 @@ test_files:
250
256
  - spec/restify/timeout_spec.rb
251
257
  - spec/restify_spec.rb
252
258
  - spec/spec_helper.rb
259
+ - spec/support/stub_server.rb
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Restify do
6
- let!(:request_stub) do
7
- stub_request(:get, 'http://localhost/base')
8
- .to_return do
9
- <<-RESPONSE.gsub(/^ {8}/, '')
10
- HTTP/1.1 #{http_status}
11
- Content-Length: 333
12
- Transfer-Encoding: chunked
13
- Link: <http://localhost/other>; rel="neat"
14
- RESPONSE
15
- end
16
- end
17
-
18
- let(:http_status) { '200 OK' }
19
-
20
- describe 'Error handling' do
21
- subject(:request) { Restify.new('http://localhost/base').get.value! }
22
-
23
- context 'for 400 status codes' do
24
- let(:http_status) { '400 Bad Request' }
25
-
26
- it 'throws a BadRequest exception' do
27
- expect { request }.to raise_error Restify::BadRequest
28
- end
29
- end
30
-
31
- context 'for 401 status codes' do
32
- let(:http_status) { '401 Unauthorized' }
33
-
34
- it 'throws an Unauthorized exception' do
35
- expect { request }.to raise_error Restify::Unauthorized
36
- end
37
- end
38
-
39
- context 'for 404 status codes' do
40
- let(:http_status) { '404 Not Found' }
41
-
42
- it 'throws a ClientError exception' do
43
- expect { request }.to raise_error Restify::NotFoundError
44
- end
45
- end
46
-
47
- context 'for 406 status codes' do
48
- let(:http_status) { '406 Not Acceptable' }
49
-
50
- it 'throws a NotAcceptable exception' do
51
- expect { request }.to raise_error Restify::NotAcceptable
52
- end
53
- end
54
-
55
- context 'for 422 status codes' do
56
- let(:http_status) { '422 Unprocessable Entity' }
57
-
58
- it 'throws a UnprocessableEntity exception' do
59
- expect { request }.to raise_error Restify::UnprocessableEntity
60
- end
61
- end
62
-
63
- context 'for any other 4xx status codes' do
64
- let(:http_status) { '415 Unsupported Media Type' }
65
-
66
- it 'throws a generic ClientError exception' do
67
- expect { request }.to raise_error Restify::ClientError
68
- end
69
- end
70
-
71
- context 'for any 5xx status codes' do
72
- let(:http_status) { '500 Internal Server Error' }
73
-
74
- it 'throws a generic ServerError exception' do
75
- expect { request }.to raise_error Restify::ServerError
76
- end
77
- end
78
- end
79
- end