faraday 1.9.3 → 2.0.1

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +117 -1
  3. data/README.md +16 -9
  4. data/examples/client_spec.rb +1 -1
  5. data/examples/client_test.rb +2 -2
  6. data/lib/faraday/adapter/test.rb +2 -0
  7. data/lib/faraday/adapter.rb +2 -5
  8. data/lib/faraday/connection.rb +5 -86
  9. data/lib/faraday/encoders/nested_params_encoder.rb +2 -2
  10. data/lib/faraday/error.rb +3 -2
  11. data/lib/faraday/logging/formatter.rb +1 -0
  12. data/lib/faraday/middleware.rb +0 -1
  13. data/lib/faraday/middleware_registry.rb +15 -79
  14. data/lib/faraday/options.rb +3 -3
  15. data/lib/faraday/rack_builder.rb +21 -18
  16. data/lib/faraday/request/authorization.rb +28 -41
  17. data/lib/faraday/request/instrumentation.rb +2 -0
  18. data/lib/faraday/request/json.rb +55 -0
  19. data/lib/faraday/request/url_encoded.rb +2 -0
  20. data/lib/faraday/request.rb +11 -29
  21. data/lib/faraday/response/json.rb +54 -0
  22. data/lib/faraday/response/logger.rb +4 -4
  23. data/lib/faraday/response/raise_error.rb +9 -1
  24. data/lib/faraday/response.rb +8 -19
  25. data/lib/faraday/utils/headers.rb +1 -1
  26. data/lib/faraday/utils.rb +10 -5
  27. data/lib/faraday/version.rb +1 -1
  28. data/lib/faraday.rb +6 -45
  29. data/spec/faraday/connection_spec.rb +102 -51
  30. data/spec/faraday/options/env_spec.rb +2 -2
  31. data/spec/faraday/rack_builder_spec.rb +7 -50
  32. data/spec/faraday/request/authorization_spec.rb +19 -32
  33. data/spec/faraday/request/instrumentation_spec.rb +5 -7
  34. data/spec/faraday/request/json_spec.rb +111 -0
  35. data/spec/faraday/request/url_encoded_spec.rb +0 -1
  36. data/spec/faraday/request_spec.rb +0 -11
  37. data/spec/faraday/response/json_spec.rb +117 -0
  38. data/spec/faraday/response/raise_error_spec.rb +7 -4
  39. data/spec/faraday/utils_spec.rb +62 -1
  40. data/spec/support/fake_safe_buffer.rb +1 -1
  41. data/spec/support/helper_methods.rb +0 -37
  42. data/spec/support/shared_examples/adapter.rb +0 -1
  43. data/spec/support/shared_examples/request_method.rb +5 -18
  44. metadata +11 -149
  45. data/lib/faraday/adapter/typhoeus.rb +0 -15
  46. data/lib/faraday/autoload.rb +0 -87
  47. data/lib/faraday/dependency_loader.rb +0 -37
  48. data/lib/faraday/request/basic_authentication.rb +0 -20
  49. data/lib/faraday/request/token_authentication.rb +0 -20
  50. data/spec/faraday/adapter/em_http_spec.rb +0 -49
  51. data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
  52. data/spec/faraday/adapter/excon_spec.rb +0 -49
  53. data/spec/faraday/adapter/httpclient_spec.rb +0 -73
  54. data/spec/faraday/adapter/net_http_spec.rb +0 -64
  55. data/spec/faraday/adapter/patron_spec.rb +0 -18
  56. data/spec/faraday/adapter/rack_spec.rb +0 -8
  57. data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
  58. data/spec/faraday/composite_read_io_spec.rb +0 -80
  59. data/spec/faraday/response/middleware_spec.rb +0 -68
  60. data/spec/support/webmock_rack_app.rb +0 -68
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Faraday
4
- # Adds the ability for other modules to manage autoloadable
5
- # constants.
6
- #
7
- # @api private
8
- module AutoloadHelper
9
- # Registers the constants to be auto loaded.
10
- #
11
- # @param prefix [String] The require prefix. If the path is inside Faraday,
12
- # then it will be prefixed with the root path of this loaded
13
- # Faraday version.
14
- # @param options [{ Symbol => String }] library names.
15
- #
16
- # @example
17
- #
18
- # Faraday.autoload_all 'faraday/foo',
19
- # Bar: 'bar'
20
- #
21
- # # requires faraday/foo/bar to load Faraday::Bar.
22
- # Faraday::Bar
23
- #
24
- # @return [void]
25
- def autoload_all(prefix, options)
26
- if prefix.match? %r{^faraday(/|$)}i
27
- prefix = File.join(Faraday.root_path, prefix)
28
- end
29
-
30
- options.each do |const_name, path|
31
- autoload const_name, File.join(prefix, path)
32
- end
33
- end
34
-
35
- # Loads each autoloaded constant. If thread safety is a concern,
36
- # wrap this in a Mutex.
37
- #
38
- # @return [void]
39
- def load_autoloaded_constants
40
- constants.each do |const|
41
- const_get(const) if autoload?(const)
42
- end
43
- end
44
-
45
- # Filters the module's contents with those that have been already
46
- # autoloaded.
47
- #
48
- # @return [Array<Class, Module>]
49
- def all_loaded_constants
50
- constants
51
- .map { |c| const_get(c) }
52
- .select { |a| a.respond_to?(:loaded?) && a.loaded? }
53
- end
54
- end
55
-
56
- # Adapter is the base class for all Faraday adapters.
57
- # @see lib/faraday/adapter.rb Original class location
58
- class Adapter
59
- extend AutoloadHelper
60
- autoload_all 'faraday/adapter',
61
- Typhoeus: 'typhoeus',
62
- Test: 'test'
63
- end
64
-
65
- # Request represents a single HTTP request for a Faraday adapter to make.
66
- # @see lib/faraday/request.rb Original class location
67
- class Request
68
- extend AutoloadHelper
69
- autoload_all 'faraday/request',
70
- UrlEncoded: 'url_encoded',
71
- Multipart: 'multipart',
72
- Retry: 'retry',
73
- Authorization: 'authorization',
74
- BasicAuthentication: 'basic_authentication',
75
- TokenAuthentication: 'token_authentication',
76
- Instrumentation: 'instrumentation'
77
- end
78
-
79
- # Response represents the returned value of a sent Faraday request.
80
- # @see lib/faraday/response.rb Original class location
81
- class Response
82
- extend AutoloadHelper
83
- autoload_all 'faraday/response',
84
- RaiseError: 'raise_error',
85
- Logger: 'logger'
86
- end
87
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Faraday
4
- # DependencyLoader helps Faraday adapters and middleware load dependencies.
5
- module DependencyLoader
6
- attr_reader :load_error
7
-
8
- # Executes a block which should try to require and reference dependent
9
- # libraries
10
- def dependency(lib = nil)
11
- lib ? require(lib) : yield
12
- rescue LoadError, NameError => e
13
- self.load_error = e
14
- end
15
-
16
- def new(*)
17
- unless loaded?
18
- raise "missing dependency for #{self}: #{load_error.message}"
19
- end
20
-
21
- super
22
- end
23
-
24
- def loaded?
25
- load_error.nil?
26
- end
27
-
28
- def inherited(subclass)
29
- super
30
- subclass.send(:load_error=, load_error)
31
- end
32
-
33
- private
34
-
35
- attr_writer :load_error
36
- end
37
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'base64'
4
-
5
- module Faraday
6
- class Request
7
- # Authorization middleware for Basic Authentication.
8
- class BasicAuthentication < load_middleware(:authorization)
9
- # @param login [String]
10
- # @param pass [String]
11
- #
12
- # @return [String] a Basic Authentication header line
13
- def self.header(login, pass)
14
- value = Base64.encode64([login, pass].join(':'))
15
- value.delete!("\n")
16
- super(:Basic, value)
17
- end
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Faraday
4
- class Request
5
- # TokenAuthentication is a middleware that adds a 'Token' header to a
6
- # Faraday request.
7
- class TokenAuthentication < load_middleware(:authorization)
8
- # Public
9
- def self.header(token, options = nil)
10
- options ||= {}
11
- options[:token] = token
12
- super(:Token, options)
13
- end
14
-
15
- def initialize(app, token, options = nil)
16
- super(app, token, options)
17
- end
18
- end
19
- end
20
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- unless defined?(JRUBY_VERSION)
4
- RSpec.describe Faraday::Adapter::EMHttp do
5
- features :request_body_on_query_methods, :reason_phrase_parse, :trace_method,
6
- :skip_response_body_on_head, :parallel, :local_socket_binding
7
-
8
- it_behaves_like 'an adapter'
9
-
10
- it 'allows to provide adapter specific configs' do
11
- url = URI('https://example.com:1234')
12
- adapter = described_class.new nil, inactivity_timeout: 20
13
- req = adapter.create_request(url: url, request: {})
14
-
15
- expect(req.connopts.inactivity_timeout).to eq(20)
16
- end
17
-
18
- context 'Options' do
19
- let(:request) { Faraday::RequestOptions.new }
20
- let(:env) { { request: request } }
21
- let(:options) { {} }
22
- let(:adapter) { Faraday::Adapter::EMHttp.new }
23
-
24
- it 'configures timeout' do
25
- request.timeout = 5
26
- adapter.configure_timeout(options, env)
27
- expect(options[:inactivity_timeout]).to eq(5)
28
- expect(options[:connect_timeout]).to eq(5)
29
- end
30
-
31
- it 'configures timeout and open_timeout' do
32
- request.timeout = 5
33
- request.open_timeout = 1
34
- adapter.configure_timeout(options, env)
35
- expect(options[:inactivity_timeout]).to eq(5)
36
- expect(options[:connect_timeout]).to eq(1)
37
- end
38
-
39
- it 'configures all timeout settings' do
40
- request.timeout = 5
41
- request.read_timeout = 3
42
- request.open_timeout = 1
43
- adapter.configure_timeout(options, env)
44
- expect(options[:inactivity_timeout]).to eq(3)
45
- expect(options[:connect_timeout]).to eq(1)
46
- end
47
- end
48
- end
49
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- unless defined?(JRUBY_VERSION)
4
- RSpec.describe Faraday::Adapter::EMSynchrony do
5
- features :request_body_on_query_methods, :reason_phrase_parse,
6
- :skip_response_body_on_head, :parallel, :local_socket_binding
7
-
8
- it_behaves_like 'an adapter'
9
-
10
- it 'allows to provide adapter specific configs' do
11
- url = URI('https://example.com:1234')
12
- adapter = described_class.new nil, inactivity_timeout: 20
13
- req = adapter.create_request(url: url, request: {})
14
-
15
- expect(req.connopts.inactivity_timeout).to eq(20)
16
- end
17
- end
18
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Adapter::Excon do
4
- features :request_body_on_query_methods, :reason_phrase_parse, :trace_method
5
-
6
- it_behaves_like 'an adapter'
7
-
8
- it 'allows to provide adapter specific configs' do
9
- url = URI('https://example.com:1234')
10
-
11
- adapter = described_class.new(nil, debug_request: true)
12
-
13
- conn = adapter.build_connection(url: url)
14
-
15
- expect(conn.data[:debug_request]).to be_truthy
16
- end
17
-
18
- context 'config' do
19
- let(:adapter) { Faraday::Adapter::Excon.new }
20
- let(:request) { Faraday::RequestOptions.new }
21
- let(:uri) { URI.parse('https://example.com') }
22
- let(:env) { { request: request, url: uri } }
23
-
24
- it 'sets timeout' do
25
- request.timeout = 5
26
- options = adapter.send(:opts_from_env, env)
27
- expect(options[:read_timeout]).to eq(5)
28
- expect(options[:write_timeout]).to eq(5)
29
- expect(options[:connect_timeout]).to eq(5)
30
- end
31
-
32
- it 'sets timeout and open_timeout' do
33
- request.timeout = 5
34
- request.open_timeout = 3
35
- options = adapter.send(:opts_from_env, env)
36
- expect(options[:read_timeout]).to eq(5)
37
- expect(options[:write_timeout]).to eq(5)
38
- expect(options[:connect_timeout]).to eq(3)
39
- end
40
-
41
- it 'sets open_timeout' do
42
- request.open_timeout = 3
43
- options = adapter.send(:opts_from_env, env)
44
- expect(options[:read_timeout]).to eq(nil)
45
- expect(options[:write_timeout]).to eq(nil)
46
- expect(options[:connect_timeout]).to eq(3)
47
- end
48
- end
49
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Adapter::HTTPClient do
4
- # ruby gem defaults for testing purposes
5
- HTTPCLIENT_OPEN = 60
6
- HTTPCLIENT_READ = 60
7
- HTTPCLIENT_WRITE = 120
8
-
9
- features :request_body_on_query_methods, :reason_phrase_parse, :compression,
10
- :trace_method, :local_socket_binding
11
-
12
- it_behaves_like 'an adapter'
13
-
14
- it 'allows to provide adapter specific configs' do
15
- adapter = described_class.new do |client|
16
- client.keep_alive_timeout = 20
17
- client.ssl_config.timeout = 25
18
- end
19
-
20
- client = adapter.build_connection(url: URI.parse('https://example.com'))
21
- expect(client.keep_alive_timeout).to eq(20)
22
- expect(client.ssl_config.timeout).to eq(25)
23
- end
24
-
25
- context 'Options' do
26
- let(:request) { Faraday::RequestOptions.new }
27
- let(:env) { { request: request } }
28
- let(:options) { {} }
29
- let(:adapter) { Faraday::Adapter::HTTPClient.new }
30
- let(:client) { adapter.connection(url: URI.parse('https://example.com')) }
31
-
32
- it 'configures timeout' do
33
- assert_default_timeouts!
34
-
35
- request.timeout = 5
36
- adapter.configure_timeouts(client, request)
37
-
38
- expect(client.connect_timeout).to eq(5)
39
- expect(client.send_timeout).to eq(5)
40
- expect(client.receive_timeout).to eq(5)
41
- end
42
-
43
- it 'configures open timeout' do
44
- assert_default_timeouts!
45
-
46
- request.open_timeout = 1
47
- adapter.configure_timeouts(client, request)
48
-
49
- expect(client.connect_timeout).to eq(1)
50
- expect(client.send_timeout).to eq(HTTPCLIENT_WRITE)
51
- expect(client.receive_timeout).to eq(HTTPCLIENT_READ)
52
- end
53
-
54
- it 'configures multiple timeouts' do
55
- assert_default_timeouts!
56
-
57
- request.open_timeout = 1
58
- request.write_timeout = 10
59
- request.read_timeout = 5
60
- adapter.configure_timeouts(client, request)
61
-
62
- expect(client.connect_timeout).to eq(1)
63
- expect(client.send_timeout).to eq(10)
64
- expect(client.receive_timeout).to eq(5)
65
- end
66
-
67
- def assert_default_timeouts!
68
- expect(client.connect_timeout).to eq(HTTPCLIENT_OPEN)
69
- expect(client.send_timeout).to eq(HTTPCLIENT_WRITE)
70
- expect(client.receive_timeout).to eq(HTTPCLIENT_READ)
71
- end
72
- end
73
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Adapter::NetHttp do
4
- features :request_body_on_query_methods, :reason_phrase_parse, :compression, :streaming, :trace_method
5
-
6
- it_behaves_like 'an adapter'
7
-
8
- context 'checking http' do
9
- let(:url) { URI('http://example.com') }
10
- let(:adapter) { described_class.new }
11
- let(:http) { adapter.send(:connection, url: url, request: {}) }
12
-
13
- it { expect(http.port).to eq(80) }
14
-
15
- it 'sets max_retries to 0' do
16
- adapter.send(:configure_request, http, {})
17
-
18
- expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=)
19
- end
20
-
21
- it 'supports write_timeout' do
22
- adapter.send(:configure_request, http, write_timeout: 10)
23
-
24
- expect(http.write_timeout).to eq(10) if http.respond_to?(:write_timeout=)
25
- end
26
-
27
- it 'supports open_timeout' do
28
- adapter.send(:configure_request, http, open_timeout: 10)
29
-
30
- expect(http.open_timeout).to eq(10)
31
- end
32
-
33
- it 'supports read_timeout' do
34
- adapter.send(:configure_request, http, read_timeout: 10)
35
-
36
- expect(http.read_timeout).to eq(10)
37
- end
38
-
39
- context 'with https url' do
40
- let(:url) { URI('https://example.com') }
41
-
42
- it { expect(http.port).to eq(443) }
43
- end
44
-
45
- context 'with http url including port' do
46
- let(:url) { URI('https://example.com:1234') }
47
-
48
- it { expect(http.port).to eq(1234) }
49
- end
50
-
51
- context 'with custom adapter config' do
52
- let(:adapter) do
53
- described_class.new do |http|
54
- http.continue_timeout = 123
55
- end
56
- end
57
-
58
- it do
59
- adapter.send(:configure_request, http, {})
60
- expect(http.continue_timeout).to eq(123)
61
- end
62
- end
63
- end
64
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Adapter::Patron, unless: defined?(JRUBY_VERSION) do
4
- features :reason_phrase_parse
5
-
6
- it_behaves_like 'an adapter'
7
-
8
- it 'allows to provide adapter specific configs' do
9
- conn = Faraday.new do |f|
10
- f.adapter :patron do |session|
11
- session.max_redirects = 10
12
- raise 'Configuration block called'
13
- end
14
- end
15
-
16
- expect { conn.get('/') }.to raise_error(RuntimeError, 'Configuration block called')
17
- end
18
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Adapter::Rack do
4
- features :request_body_on_query_methods, :trace_method,
5
- :skip_response_body_on_head
6
-
7
- it_behaves_like 'an adapter', adapter_options: WebmockRackApp.new
8
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Adapter::Typhoeus do
4
- features :request_body_on_query_methods, :parallel, :trace_method
5
-
6
- it_behaves_like 'an adapter'
7
- end
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'stringio'
4
-
5
- RSpec.describe Faraday::CompositeReadIO do
6
- Part = Struct.new(:to_io) do
7
- def length
8
- to_io.string.length
9
- end
10
- end
11
-
12
- def part(str)
13
- Part.new StringIO.new(str)
14
- end
15
-
16
- def composite_io(*parts)
17
- Faraday::CompositeReadIO.new(*parts)
18
- end
19
-
20
- context 'with empty composite_io' do
21
- subject { composite_io }
22
-
23
- it { expect(subject.length).to eq(0) }
24
- it { expect(subject.read).to eq('') }
25
- it { expect(subject.read(1)).to be_nil }
26
- end
27
-
28
- context 'with empty parts' do
29
- subject { composite_io(part(''), part('')) }
30
-
31
- it { expect(subject.length).to eq(0) }
32
- it { expect(subject.read).to eq('') }
33
- it { expect(subject.read(1)).to be_nil }
34
- end
35
-
36
- context 'with 2 parts' do
37
- subject { composite_io(part('abcd'), part('1234')) }
38
-
39
- it { expect(subject.length).to eq(8) }
40
- it { expect(subject.read).to eq('abcd1234') }
41
- it 'allows to read in chunks' do
42
- expect(subject.read(3)).to eq('abc')
43
- expect(subject.read(3)).to eq('d12')
44
- expect(subject.read(3)).to eq('34')
45
- expect(subject.read(3)).to be_nil
46
- end
47
- it 'allows to rewind while reading in chunks' do
48
- expect(subject.read(3)).to eq('abc')
49
- expect(subject.read(3)).to eq('d12')
50
- subject.rewind
51
- expect(subject.read(3)).to eq('abc')
52
- expect(subject.read(5)).to eq('d1234')
53
- expect(subject.read(3)).to be_nil
54
- subject.rewind
55
- expect(subject.read(2)).to eq('ab')
56
- end
57
- end
58
-
59
- context 'with mix of empty and non-empty parts' do
60
- subject { composite_io(part(''), part('abcd'), part(''), part('1234'), part('')) }
61
-
62
- it 'allows to read in chunks' do
63
- expect(subject.read(6)).to eq('abcd12')
64
- expect(subject.read(6)).to eq('34')
65
- expect(subject.read(6)).to be_nil
66
- end
67
- end
68
-
69
- context 'with utf8 multibyte part' do
70
- subject { composite_io(part("\x86"), part('ファイル')) }
71
-
72
- it { expect(subject.read).to eq(String.new("\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB", encoding: 'BINARY')) }
73
- it 'allows to read in chunks' do
74
- expect(subject.read(3)).to eq(String.new("\x86\xE3\x83", encoding: 'BINARY'))
75
- expect(subject.read(3)).to eq(String.new("\x95\xE3\x82", encoding: 'BINARY'))
76
- expect(subject.read(8)).to eq(String.new("\xA1\xE3\x82\xA4\xE3\x83\xAB", encoding: 'BINARY'))
77
- expect(subject.read(3)).to be_nil
78
- end
79
- end
80
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Faraday::Response::Middleware do
4
- let(:conn) do
5
- Faraday.new do |b|
6
- b.use custom_middleware
7
- b.adapter :test do |stub|
8
- stub.get('ok') { [200, { 'Content-Type' => 'text/html' }, '<body></body>'] }
9
- stub.get('not_modified') { [304, nil, nil] }
10
- stub.get('no_content') { [204, nil, nil] }
11
- end
12
- end
13
- end
14
-
15
- context 'with a custom ResponseMiddleware' do
16
- let(:custom_middleware) do
17
- Class.new(Faraday::Response::Middleware) do
18
- def parse(body)
19
- body.upcase
20
- end
21
- end
22
- end
23
-
24
- it 'parses the response' do
25
- expect(conn.get('ok').body).to eq('<BODY></BODY>')
26
- end
27
- end
28
-
29
- context 'with a custom ResponseMiddleware and private parse' do
30
- let(:custom_middleware) do
31
- Class.new(Faraday::Response::Middleware) do
32
- private
33
-
34
- def parse(body)
35
- body.upcase
36
- end
37
- end
38
- end
39
-
40
- it 'parses the response' do
41
- expect(conn.get('ok').body).to eq('<BODY></BODY>')
42
- end
43
- end
44
-
45
- context 'with a custom ResponseMiddleware but empty response' do
46
- let(:custom_middleware) do
47
- Class.new(Faraday::Response::Middleware) do
48
- def parse(_body)
49
- raise 'this should not be called'
50
- end
51
- end
52
- end
53
-
54
- it 'raises exception for 200 responses' do
55
- expect { conn.get('ok') }.to raise_error(StandardError)
56
- end
57
-
58
- it 'doesn\'t call the middleware for 204 responses' do
59
- expect_any_instance_of(custom_middleware).not_to receive(:parse)
60
- expect(conn.get('no_content').body).to be_nil
61
- end
62
-
63
- it 'doesn\'t call the middleware for 304 responses' do
64
- expect_any_instance_of(custom_middleware).not_to receive(:parse)
65
- expect(conn.get('not_modified').body).to be_nil
66
- end
67
- end
68
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Rack app used to test the Rack adapter.
4
- # Uses Webmock to check if requests are registered, in which case it returns
5
- # the registered response.
6
- class WebmockRackApp
7
- def call(env)
8
- req_signature = WebMock::RequestSignature.new(
9
- req_method(env),
10
- req_uri(env),
11
- body: req_body(env),
12
- headers: req_headers(env)
13
- )
14
-
15
- WebMock::RequestRegistry
16
- .instance
17
- .requested_signatures
18
- .put(req_signature)
19
-
20
- process_response(req_signature)
21
- end
22
-
23
- def req_method(env)
24
- env['REQUEST_METHOD'].downcase.to_sym
25
- end
26
-
27
- def req_uri(env)
28
- scheme = env['rack.url_scheme']
29
- host = env['SERVER_NAME']
30
- port = env['SERVER_PORT']
31
- path = env['PATH_INFO']
32
- query = env['QUERY_STRING']
33
-
34
- url = +"#{scheme}://#{host}:#{port}#{path}"
35
- url += "?#{query}" if query
36
-
37
- uri = WebMock::Util::URI.heuristic_parse(url)
38
- uri.path = uri.normalized_path.gsub('[^:]//', '/')
39
- uri
40
- end
41
-
42
- def req_headers(env)
43
- http_headers = env.select { |k, _| k.start_with?('HTTP_') }
44
- .map { |k, v| [k[5..-1], v] }
45
- .to_h
46
-
47
- special_headers = Faraday::Adapter::Rack::SPECIAL_HEADERS
48
- http_headers.merge(env.select { |k, _| special_headers.include?(k) })
49
- end
50
-
51
- def req_body(env)
52
- env['rack.input'].read
53
- end
54
-
55
- def process_response(req_signature)
56
- res = WebMock::StubRegistry.instance.response_for_request(req_signature)
57
-
58
- if res.nil? && req_signature.uri.host == 'localhost'
59
- raise Faraday::ConnectionFailed, 'Trying to connect to localhost'
60
- end
61
-
62
- raise WebMock::NetConnectNotAllowedError, req_signature unless res
63
-
64
- raise Faraday::TimeoutError if res.should_timeout
65
-
66
- [res.status[0], res.headers || {}, [res.body || '']]
67
- end
68
- end