faraday 0.15.4 → 1.6.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/CHANGELOG.md +380 -0
- data/LICENSE.md +1 -1
- data/README.md +16 -344
- data/Rakefile +7 -0
- data/examples/client_spec.rb +65 -0
- data/examples/client_test.rb +79 -0
- data/lib/faraday.rb +127 -190
- data/lib/faraday/adapter.rb +72 -22
- data/lib/faraday/adapter/test.rb +86 -53
- data/lib/faraday/adapter/typhoeus.rb +4 -1
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/autoload.rb +39 -36
- data/lib/faraday/connection.rb +320 -183
- data/lib/faraday/dependency_loader.rb +37 -0
- data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
- data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
- data/lib/faraday/error.rb +123 -37
- data/lib/faraday/file_part.rb +128 -0
- data/lib/faraday/logging/formatter.rb +105 -0
- data/lib/faraday/methods.rb +6 -0
- data/lib/faraday/middleware.rb +19 -25
- data/lib/faraday/middleware_registry.rb +129 -0
- data/lib/faraday/options.rb +39 -194
- data/lib/faraday/options/connection_options.rb +22 -0
- data/lib/faraday/options/env.rb +181 -0
- data/lib/faraday/options/proxy_options.rb +32 -0
- data/lib/faraday/options/request_options.rb +22 -0
- data/lib/faraday/options/ssl_options.rb +59 -0
- data/lib/faraday/param_part.rb +53 -0
- data/lib/faraday/parameters.rb +4 -197
- data/lib/faraday/rack_builder.rb +77 -65
- data/lib/faraday/request.rb +86 -44
- data/lib/faraday/request/authorization.rb +44 -30
- data/lib/faraday/request/basic_authentication.rb +14 -7
- data/lib/faraday/request/instrumentation.rb +45 -27
- data/lib/faraday/request/multipart.rb +86 -48
- data/lib/faraday/request/retry.rb +198 -169
- data/lib/faraday/request/token_authentication.rb +15 -10
- data/lib/faraday/request/url_encoded.rb +43 -23
- data/lib/faraday/response.rb +27 -23
- data/lib/faraday/response/logger.rb +22 -69
- data/lib/faraday/response/raise_error.rb +49 -14
- data/lib/faraday/utils.rb +38 -247
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/version.rb +5 -0
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/spec/faraday/adapter/em_http_spec.rb +49 -0
- data/spec/faraday/adapter/em_synchrony_spec.rb +18 -0
- data/spec/faraday/adapter/excon_spec.rb +49 -0
- data/spec/faraday/adapter/httpclient_spec.rb +73 -0
- data/spec/faraday/adapter/net_http_spec.rb +64 -0
- data/spec/faraday/adapter/patron_spec.rb +18 -0
- data/spec/faraday/adapter/rack_spec.rb +8 -0
- data/spec/faraday/adapter/test_spec.rb +260 -0
- data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
- data/spec/faraday/adapter_registry_spec.rb +28 -0
- data/spec/faraday/adapter_spec.rb +55 -0
- data/spec/faraday/composite_read_io_spec.rb +80 -0
- data/spec/faraday/connection_spec.rb +736 -0
- data/spec/faraday/error_spec.rb +60 -0
- data/spec/faraday/middleware_spec.rb +52 -0
- data/spec/faraday/options/env_spec.rb +70 -0
- data/spec/faraday/options/options_spec.rb +297 -0
- data/spec/faraday/options/proxy_options_spec.rb +44 -0
- data/spec/faraday/options/request_options_spec.rb +19 -0
- data/spec/faraday/params_encoders/flat_spec.rb +42 -0
- data/spec/faraday/params_encoders/nested_spec.rb +142 -0
- data/spec/faraday/rack_builder_spec.rb +345 -0
- data/spec/faraday/request/authorization_spec.rb +88 -0
- data/spec/faraday/request/instrumentation_spec.rb +76 -0
- data/spec/faraday/request/multipart_spec.rb +302 -0
- data/spec/faraday/request/retry_spec.rb +242 -0
- data/spec/faraday/request/url_encoded_spec.rb +83 -0
- data/spec/faraday/request_spec.rb +120 -0
- data/spec/faraday/response/logger_spec.rb +220 -0
- data/spec/faraday/response/middleware_spec.rb +68 -0
- data/spec/faraday/response/raise_error_spec.rb +169 -0
- data/spec/faraday/response_spec.rb +75 -0
- data/spec/faraday/utils/headers_spec.rb +82 -0
- data/spec/faraday/utils_spec.rb +56 -0
- data/spec/faraday_spec.rb +37 -0
- data/spec/spec_helper.rb +132 -0
- data/spec/support/disabling_stub.rb +14 -0
- data/spec/support/fake_safe_buffer.rb +15 -0
- data/spec/support/helper_methods.rb +133 -0
- data/spec/support/shared_examples/adapter.rb +105 -0
- data/spec/support/shared_examples/params_encoder.rb +18 -0
- data/spec/support/shared_examples/request_method.rb +262 -0
- data/spec/support/streaming_response_checker.rb +35 -0
- data/spec/support/webmock_rack_app.rb +68 -0
- metadata +206 -19
- data/lib/faraday/adapter/em_http.rb +0 -243
- data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
- data/lib/faraday/adapter/em_synchrony.rb +0 -106
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
- data/lib/faraday/adapter/excon.rb +0 -82
- data/lib/faraday/adapter/httpclient.rb +0 -128
- data/lib/faraday/adapter/net_http.rb +0 -152
- data/lib/faraday/adapter/net_http_persistent.rb +0 -68
- data/lib/faraday/adapter/patron.rb +0 -95
- data/lib/faraday/adapter/rack.rb +0 -58
- data/lib/faraday/upload_io.rb +0 -67
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
module Utils
|
5
|
+
# A case-insensitive Hash that preserves the original case of a header
|
6
|
+
# when set.
|
7
|
+
#
|
8
|
+
# Adapted from Rack::Utils::HeaderHash
|
9
|
+
class Headers < ::Hash
|
10
|
+
def self.from(value)
|
11
|
+
new(value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.allocate
|
15
|
+
new_self = super
|
16
|
+
new_self.initialize_names
|
17
|
+
new_self
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(hash = nil)
|
21
|
+
super()
|
22
|
+
@names = {}
|
23
|
+
update(hash || {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize_names
|
27
|
+
@names = {}
|
28
|
+
end
|
29
|
+
|
30
|
+
# on dup/clone, we need to duplicate @names hash
|
31
|
+
def initialize_copy(other)
|
32
|
+
super
|
33
|
+
@names = other.names.dup
|
34
|
+
end
|
35
|
+
|
36
|
+
# need to synchronize concurrent writes to the shared KeyMap
|
37
|
+
keymap_mutex = Mutex.new
|
38
|
+
|
39
|
+
# symbol -> string mapper + cache
|
40
|
+
KeyMap = Hash.new do |map, key|
|
41
|
+
value = if key.respond_to?(:to_str)
|
42
|
+
key
|
43
|
+
else
|
44
|
+
key.to_s.split('_') # user_agent: %w(user agent)
|
45
|
+
.each(&:capitalize!) # => %w(User Agent)
|
46
|
+
.join('-') # => "User-Agent"
|
47
|
+
end
|
48
|
+
keymap_mutex.synchronize { map[key] = value }
|
49
|
+
end
|
50
|
+
KeyMap[:etag] = 'ETag'
|
51
|
+
|
52
|
+
def [](key)
|
53
|
+
key = KeyMap[key]
|
54
|
+
super(key) || super(@names[key.downcase])
|
55
|
+
end
|
56
|
+
|
57
|
+
def []=(key, val)
|
58
|
+
key = KeyMap[key]
|
59
|
+
key = (@names[key.downcase] ||= key)
|
60
|
+
# join multiple values with a comma
|
61
|
+
val = val.to_ary.join(', ') if val.respond_to?(:to_ary)
|
62
|
+
super(key, val)
|
63
|
+
end
|
64
|
+
|
65
|
+
def fetch(key, *args, &block)
|
66
|
+
key = KeyMap[key]
|
67
|
+
key = @names.fetch(key.downcase, key)
|
68
|
+
super(key, *args, &block)
|
69
|
+
end
|
70
|
+
|
71
|
+
def delete(key)
|
72
|
+
key = KeyMap[key]
|
73
|
+
key = @names[key.downcase]
|
74
|
+
return unless key
|
75
|
+
|
76
|
+
@names.delete key.downcase
|
77
|
+
super(key)
|
78
|
+
end
|
79
|
+
|
80
|
+
def include?(key)
|
81
|
+
@names.include? key.downcase
|
82
|
+
end
|
83
|
+
|
84
|
+
alias has_key? include?
|
85
|
+
alias member? include?
|
86
|
+
alias key? include?
|
87
|
+
|
88
|
+
def merge!(other)
|
89
|
+
other.each { |k, v| self[k] = v }
|
90
|
+
self
|
91
|
+
end
|
92
|
+
|
93
|
+
alias update merge!
|
94
|
+
|
95
|
+
def merge(other)
|
96
|
+
hash = dup
|
97
|
+
hash.merge! other
|
98
|
+
end
|
99
|
+
|
100
|
+
def replace(other)
|
101
|
+
clear
|
102
|
+
@names.clear
|
103
|
+
update other
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
def to_hash
|
108
|
+
{}.update(self)
|
109
|
+
end
|
110
|
+
|
111
|
+
def parse(header_string)
|
112
|
+
return unless header_string && !header_string.empty?
|
113
|
+
|
114
|
+
headers = header_string.split(/\r\n/)
|
115
|
+
|
116
|
+
# Find the last set of response headers.
|
117
|
+
start_index = headers.rindex { |x| x.start_with?('HTTP/') } || 0
|
118
|
+
last_response = headers.slice(start_index, headers.size)
|
119
|
+
|
120
|
+
last_response
|
121
|
+
.tap { |a| a.shift if a.first.start_with?('HTTP/') }
|
122
|
+
.map { |h| h.split(/:\s*/, 2) } # split key and value
|
123
|
+
.reject { |p| p[0].nil? } # ignore blank lines
|
124
|
+
.each { |key, value| add_parsed(key, value) }
|
125
|
+
end
|
126
|
+
|
127
|
+
protected
|
128
|
+
|
129
|
+
attr_reader :names
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
# Join multiple values with a comma.
|
134
|
+
def add_parsed(key, value)
|
135
|
+
self[key] ? self[key] << ', ' << value : self[key] = value
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
module Utils
|
5
|
+
# A hash with stringified keys.
|
6
|
+
class ParamsHash < Hash
|
7
|
+
def [](key)
|
8
|
+
super(convert_key(key))
|
9
|
+
end
|
10
|
+
|
11
|
+
def []=(key, value)
|
12
|
+
super(convert_key(key), value)
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete(key)
|
16
|
+
super(convert_key(key))
|
17
|
+
end
|
18
|
+
|
19
|
+
def include?(key)
|
20
|
+
super(convert_key(key))
|
21
|
+
end
|
22
|
+
|
23
|
+
alias has_key? include?
|
24
|
+
alias member? include?
|
25
|
+
alias key? include?
|
26
|
+
|
27
|
+
def update(params)
|
28
|
+
params.each do |key, value|
|
29
|
+
self[key] = value
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
alias merge! update
|
34
|
+
|
35
|
+
def merge(params)
|
36
|
+
dup.update(params)
|
37
|
+
end
|
38
|
+
|
39
|
+
def replace(other)
|
40
|
+
clear
|
41
|
+
update(other)
|
42
|
+
end
|
43
|
+
|
44
|
+
def merge_query(query, encoder = nil)
|
45
|
+
return self unless query && !query.empty?
|
46
|
+
|
47
|
+
update((encoder || Utils.default_params_encoder).decode(query))
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_query(encoder = nil)
|
51
|
+
(encoder || Utils.default_params_encoder).encode(self)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def convert_key(key)
|
57
|
+
key.to_s
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'webmock/rspec'
|
4
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
5
|
+
|
6
|
+
require_relative '../support/helper_methods'
|
7
|
+
require_relative '../support/disabling_stub'
|
8
|
+
require_relative '../support/streaming_response_checker'
|
9
|
+
require_relative '../support/shared_examples/adapter'
|
10
|
+
require_relative '../support/shared_examples/request_method'
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.include Faraday::HelperMethods
|
14
|
+
end
|
@@ -0,0 +1,49 @@
|
|
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
|
@@ -0,0 +1,18 @@
|
|
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
|
@@ -0,0 +1,49 @@
|
|
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
|
@@ -0,0 +1,73 @@
|
|
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
|
@@ -0,0 +1,64 @@
|
|
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
|