faraday 0.7.4 → 1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +276 -0
- data/LICENSE.md +1 -1
- data/README.md +40 -153
- data/Rakefile +4 -139
- data/examples/client_spec.rb +65 -0
- data/examples/client_test.rb +79 -0
- data/lib/faraday/adapter/em_http.rb +286 -0
- data/lib/faraday/adapter/em_http_ssl_patch.rb +62 -0
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +69 -0
- data/lib/faraday/adapter/em_synchrony.rb +120 -36
- data/lib/faraday/adapter/excon.rb +108 -12
- data/lib/faraday/adapter/httpclient.rb +152 -0
- data/lib/faraday/adapter/net_http.rb +187 -43
- data/lib/faraday/adapter/net_http_persistent.rb +91 -0
- data/lib/faraday/adapter/patron.rb +106 -10
- data/lib/faraday/adapter/rack.rb +75 -0
- data/lib/faraday/adapter/test.rb +160 -61
- data/lib/faraday/adapter/typhoeus.rb +7 -46
- data/lib/faraday/adapter.rb +105 -33
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/autoload.rb +95 -0
- data/lib/faraday/connection.rb +525 -157
- data/lib/faraday/dependency_loader.rb +37 -0
- data/lib/faraday/encoders/flat_params_encoder.rb +98 -0
- data/lib/faraday/encoders/nested_params_encoder.rb +171 -0
- data/lib/faraday/error.rb +122 -30
- data/lib/faraday/file_part.rb +128 -0
- data/lib/faraday/logging/formatter.rb +105 -0
- data/lib/faraday/middleware.rb +14 -22
- data/lib/faraday/middleware_registry.rb +129 -0
- data/lib/faraday/options/connection_options.rb +22 -0
- data/lib/faraday/options/env.rb +181 -0
- data/lib/faraday/options/proxy_options.rb +28 -0
- data/lib/faraday/options/request_options.rb +22 -0
- data/lib/faraday/options/ssl_options.rb +59 -0
- data/lib/faraday/options.rb +222 -0
- data/lib/faraday/param_part.rb +53 -0
- data/lib/faraday/parameters.rb +5 -0
- data/lib/faraday/rack_builder.rb +248 -0
- data/lib/faraday/request/authorization.rb +55 -0
- data/lib/faraday/request/basic_authentication.rb +20 -0
- data/lib/faraday/request/instrumentation.rb +54 -0
- data/lib/faraday/request/multipart.rb +84 -48
- data/lib/faraday/request/retry.rb +239 -0
- data/lib/faraday/request/token_authentication.rb +20 -0
- data/lib/faraday/request/url_encoded.rb +46 -27
- data/lib/faraday/request.rb +112 -50
- data/lib/faraday/response/logger.rb +24 -25
- data/lib/faraday/response/raise_error.rb +40 -11
- data/lib/faraday/response.rb +44 -35
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +72 -117
- data/lib/faraday.rb +142 -64
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/spec/faraday/adapter/em_http_spec.rb +47 -0
- data/spec/faraday/adapter/em_synchrony_spec.rb +16 -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_persistent_spec.rb +57 -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/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 +691 -0
- data/spec/faraday/error_spec.rb +45 -0
- data/spec/faraday/middleware_spec.rb +26 -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 +37 -0
- data/spec/faraday/options/request_options_spec.rb +19 -0
- data/spec/faraday/params_encoders/flat_spec.rb +34 -0
- data/spec/faraday/params_encoders/nested_spec.rb +134 -0
- data/spec/faraday/rack_builder_spec.rb +196 -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 +274 -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 +109 -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 +106 -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 +104 -0
- data/spec/support/shared_examples/params_encoder.rb +18 -0
- data/spec/support/shared_examples/request_method.rb +234 -0
- data/spec/support/streaming_response_checker.rb +35 -0
- data/spec/support/webmock_rack_app.rb +68 -0
- metadata +126 -126
- data/Gemfile +0 -29
- data/config.ru +0 -6
- data/faraday.gemspec +0 -92
- data/lib/faraday/adapter/action_dispatch.rb +0 -29
- data/lib/faraday/builder.rb +0 -160
- data/lib/faraday/request/json.rb +0 -35
- data/lib/faraday/upload_io.rb +0 -23
- data/test/adapters/live_test.rb +0 -205
- data/test/adapters/logger_test.rb +0 -37
- data/test/adapters/net_http_test.rb +0 -33
- data/test/adapters/test_middleware_test.rb +0 -70
- data/test/connection_test.rb +0 -254
- data/test/env_test.rb +0 -158
- data/test/helper.rb +0 -41
- data/test/live_server.rb +0 -45
- data/test/middleware_stack_test.rb +0 -118
- data/test/request_middleware_test.rb +0 -116
- data/test/response_middleware_test.rb +0 -74
data/lib/faraday.rb
CHANGED
|
@@ -1,88 +1,166 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'cgi'
|
|
4
|
+
require 'set'
|
|
5
|
+
require 'forwardable'
|
|
6
|
+
require 'faraday/middleware_registry'
|
|
7
|
+
require 'faraday/dependency_loader'
|
|
8
|
+
|
|
9
|
+
# This is the main namespace for Faraday.
|
|
10
|
+
#
|
|
11
|
+
# It provides methods to create {Connection} objects, and HTTP-related
|
|
12
|
+
# methods to use directly.
|
|
13
|
+
#
|
|
14
|
+
# @example Helpful class methods for easy usage
|
|
15
|
+
# Faraday.get "http://faraday.com"
|
|
16
|
+
#
|
|
17
|
+
# @example Helpful class method `.new` to create {Connection} objects.
|
|
18
|
+
# conn = Faraday.new "http://faraday.com"
|
|
19
|
+
# conn.get '/'
|
|
20
|
+
#
|
|
1
21
|
module Faraday
|
|
2
|
-
VERSION =
|
|
22
|
+
VERSION = '1.0.1'
|
|
23
|
+
METHODS_WITH_QUERY = %w[get head delete trace].freeze
|
|
24
|
+
METHODS_WITH_BODY = %w[post put patch].freeze
|
|
3
25
|
|
|
4
26
|
class << self
|
|
5
|
-
|
|
6
|
-
|
|
27
|
+
# The root path that Faraday is being loaded from.
|
|
28
|
+
#
|
|
29
|
+
# This is the root from where the libraries are auto-loaded.
|
|
30
|
+
#
|
|
31
|
+
# @return [String]
|
|
32
|
+
attr_accessor :root_path
|
|
7
33
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
34
|
+
# Gets or sets the path that the Faraday libs are loaded from.
|
|
35
|
+
# @return [String]
|
|
36
|
+
attr_accessor :lib_path
|
|
12
37
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
38
|
+
# @overload default_adapter
|
|
39
|
+
# Gets the Symbol key identifying a default Adapter to use
|
|
40
|
+
# for the default {Faraday::Connection}. Defaults to `:net_http`.
|
|
41
|
+
# @return [Symbol] the default adapter
|
|
42
|
+
# @overload default_adapter=(adapter)
|
|
43
|
+
# Updates default adapter while resetting {.default_connection}.
|
|
44
|
+
# @return [Symbol] the new default_adapter.
|
|
45
|
+
attr_reader :default_adapter
|
|
18
46
|
|
|
19
|
-
|
|
47
|
+
# Documented below, see default_connection
|
|
48
|
+
attr_writer :default_connection
|
|
20
49
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
50
|
+
# Tells Faraday to ignore the environment proxy (http_proxy).
|
|
51
|
+
# Defaults to `false`.
|
|
52
|
+
# @return [Boolean]
|
|
53
|
+
attr_accessor :ignore_env_proxy
|
|
24
54
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
55
|
+
# Initializes a new {Connection}.
|
|
56
|
+
#
|
|
57
|
+
# @param url [String,Hash] The optional String base URL to use as a prefix
|
|
58
|
+
# for all requests. Can also be the options Hash. Any of these
|
|
59
|
+
# values will be set on every request made, unless overridden
|
|
60
|
+
# for a specific request.
|
|
61
|
+
# @param options [Hash]
|
|
62
|
+
# @option options [String] :url Base URL
|
|
63
|
+
# @option options [Hash] :params Hash of unencoded URI query params.
|
|
64
|
+
# @option options [Hash] :headers Hash of unencoded HTTP headers.
|
|
65
|
+
# @option options [Hash] :request Hash of request options.
|
|
66
|
+
# @option options [Hash] :ssl Hash of SSL options.
|
|
67
|
+
# @option options [Hash] :proxy Hash of Proxy options.
|
|
68
|
+
# @return [Faraday::Connection]
|
|
69
|
+
#
|
|
70
|
+
# @example With an URL argument
|
|
71
|
+
# Faraday.new 'http://faraday.com'
|
|
72
|
+
# # => Faraday::Connection to http://faraday.com
|
|
73
|
+
#
|
|
74
|
+
# @example With an URL argument and an options hash
|
|
75
|
+
# Faraday.new 'http://faraday.com', params: { page: 1 }
|
|
76
|
+
# # => Faraday::Connection to http://faraday.com?page=1
|
|
77
|
+
#
|
|
78
|
+
# @example With everything in an options hash
|
|
79
|
+
# Faraday.new url: 'http://faraday.com',
|
|
80
|
+
# params: { page: 1 }
|
|
81
|
+
# # => Faraday::Connection to http://faraday.com?page=1
|
|
82
|
+
def new(url = nil, options = {}, &block)
|
|
83
|
+
options = default_connection_options.merge(options)
|
|
84
|
+
Faraday::Connection.new(url, options, &block)
|
|
28
85
|
end
|
|
29
86
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
87
|
+
# @private
|
|
88
|
+
# Internal: Requires internal Faraday libraries.
|
|
89
|
+
#
|
|
90
|
+
# @param libs [Array] one or more relative String names to Faraday classes.
|
|
91
|
+
# @return [void]
|
|
92
|
+
def require_libs(*libs)
|
|
93
|
+
libs.each do |lib|
|
|
94
|
+
require "#{lib_path}/#{lib}"
|
|
95
|
+
end
|
|
33
96
|
end
|
|
34
97
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
98
|
+
alias require_lib require_libs
|
|
99
|
+
|
|
100
|
+
# Documented elsewhere, see default_adapter reader
|
|
101
|
+
def default_adapter=(adapter)
|
|
102
|
+
@default_connection = nil
|
|
103
|
+
@default_adapter = adapter
|
|
39
104
|
end
|
|
40
105
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def load_autoloaded_constants
|
|
44
|
-
constants.each do |const|
|
|
45
|
-
const_get(const) if autoload?(const)
|
|
46
|
-
end
|
|
106
|
+
def respond_to_missing?(symbol, include_private = false)
|
|
107
|
+
default_connection.respond_to?(symbol, include_private) || super
|
|
47
108
|
end
|
|
48
109
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
110
|
+
private
|
|
111
|
+
|
|
112
|
+
# Internal: Proxies method calls on the Faraday constant to
|
|
113
|
+
# .default_connection.
|
|
114
|
+
def method_missing(name, *args, &block)
|
|
115
|
+
if default_connection.respond_to?(name)
|
|
116
|
+
default_connection.send(name, *args, &block)
|
|
117
|
+
else
|
|
118
|
+
super
|
|
119
|
+
end
|
|
52
120
|
end
|
|
53
121
|
end
|
|
54
122
|
|
|
55
|
-
|
|
123
|
+
self.ignore_env_proxy = false
|
|
124
|
+
self.root_path = File.expand_path __dir__
|
|
125
|
+
self.lib_path = File.expand_path 'faraday', __dir__
|
|
126
|
+
self.default_adapter = :net_http
|
|
56
127
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
128
|
+
# @overload default_connection
|
|
129
|
+
# Gets the default connection used for simple scripts.
|
|
130
|
+
# @return [Faraday::Connection] a connection configured with
|
|
131
|
+
# the default_adapter.
|
|
132
|
+
# @overload default_connection=(connection)
|
|
133
|
+
# @param connection [Faraday::Connection]
|
|
134
|
+
# Sets the default {Faraday::Connection} for simple scripts that
|
|
135
|
+
# access the Faraday constant directly, such as
|
|
136
|
+
# <code>Faraday.get "https://faraday.com"</code>.
|
|
137
|
+
def self.default_connection
|
|
138
|
+
@default_connection ||= Connection.new(default_connection_options)
|
|
139
|
+
end
|
|
66
140
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
141
|
+
# Gets the default connection options used when calling {Faraday#new}.
|
|
142
|
+
#
|
|
143
|
+
# @return [Faraday::ConnectionOptions]
|
|
144
|
+
def self.default_connection_options
|
|
145
|
+
@default_connection_options ||= ConnectionOptions.new
|
|
146
|
+
end
|
|
71
147
|
|
|
72
|
-
#
|
|
73
|
-
class Object
|
|
74
|
-
# Yields <code>x</code> to the block, and then returns <code>x</code>.
|
|
75
|
-
# The primary purpose of this method is to "tap into" a method chain,
|
|
76
|
-
# in order to perform operations on intermediate results within the chain.
|
|
148
|
+
# Sets the default options used when calling {Faraday#new}.
|
|
77
149
|
#
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
end
|
|
150
|
+
# @param options [Hash, Faraday::ConnectionOptions]
|
|
151
|
+
def self.default_connection_options=(options)
|
|
152
|
+
@default_connection = nil
|
|
153
|
+
@default_connection_options = ConnectionOptions.from(options)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
unless defined?(::Faraday::Timer)
|
|
157
|
+
require 'timeout'
|
|
158
|
+
Timer = Timeout
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
require_libs 'utils', 'options', 'connection', 'rack_builder', 'parameters',
|
|
162
|
+
'middleware', 'adapter', 'request', 'response', 'error',
|
|
163
|
+
'file_part', 'param_part'
|
|
164
|
+
|
|
165
|
+
require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
|
|
88
166
|
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,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Faraday::Adapter::EMHttp, unless: defined?(JRUBY_VERSION) do
|
|
4
|
+
features :request_body_on_query_methods, :reason_phrase_parse, :trace_method,
|
|
5
|
+
:skip_response_body_on_head, :parallel, :local_socket_binding
|
|
6
|
+
|
|
7
|
+
it_behaves_like 'an adapter'
|
|
8
|
+
|
|
9
|
+
it 'allows to provide adapter specific configs' do
|
|
10
|
+
url = URI('https://example.com:1234')
|
|
11
|
+
adapter = described_class.new nil, inactivity_timeout: 20
|
|
12
|
+
req = adapter.create_request(url: url, request: {})
|
|
13
|
+
|
|
14
|
+
expect(req.connopts.inactivity_timeout).to eq(20)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'Options' do
|
|
18
|
+
let(:request) { Faraday::RequestOptions.new }
|
|
19
|
+
let(:env) { { request: request } }
|
|
20
|
+
let(:options) { {} }
|
|
21
|
+
let(:adapter) { Faraday::Adapter::EMHttp.new }
|
|
22
|
+
|
|
23
|
+
it 'configures timeout' do
|
|
24
|
+
request.timeout = 5
|
|
25
|
+
adapter.configure_timeout(options, env)
|
|
26
|
+
expect(options[:inactivity_timeout]).to eq(5)
|
|
27
|
+
expect(options[:connect_timeout]).to eq(5)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'configures timeout and open_timeout' do
|
|
31
|
+
request.timeout = 5
|
|
32
|
+
request.open_timeout = 1
|
|
33
|
+
adapter.configure_timeout(options, env)
|
|
34
|
+
expect(options[:inactivity_timeout]).to eq(5)
|
|
35
|
+
expect(options[:connect_timeout]).to eq(1)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'configures all timeout settings' do
|
|
39
|
+
request.timeout = 5
|
|
40
|
+
request.read_timeout = 3
|
|
41
|
+
request.open_timeout = 1
|
|
42
|
+
adapter.configure_timeout(options, env)
|
|
43
|
+
expect(options[:inactivity_timeout]).to eq(3)
|
|
44
|
+
expect(options[:connect_timeout]).to eq(1)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Faraday::Adapter::EMSynchrony, unless: defined?(JRUBY_VERSION) do
|
|
4
|
+
features :request_body_on_query_methods, :reason_phrase_parse,
|
|
5
|
+
:skip_response_body_on_head, :parallel, :local_socket_binding
|
|
6
|
+
|
|
7
|
+
it_behaves_like 'an adapter'
|
|
8
|
+
|
|
9
|
+
it 'allows to provide adapter specific configs' do
|
|
10
|
+
url = URI('https://example.com:1234')
|
|
11
|
+
adapter = described_class.new nil, inactivity_timeout: 20
|
|
12
|
+
req = adapter.create_request(url: url, request: {})
|
|
13
|
+
|
|
14
|
+
expect(req.connopts.inactivity_timeout).to eq(20)
|
|
15
|
+
end
|
|
16
|
+
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,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Faraday::Adapter::NetHttpPersistent do
|
|
4
|
+
features :request_body_on_query_methods, :reason_phrase_parse, :compression, :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')
|
|
10
|
+
|
|
11
|
+
adapter = described_class.new do |http|
|
|
12
|
+
http.idle_timeout = 123
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
http = adapter.send(:connection, url: url, request: {})
|
|
16
|
+
adapter.send(:configure_request, http, {})
|
|
17
|
+
|
|
18
|
+
expect(http.idle_timeout).to eq(123)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'sets max_retries to 0' do
|
|
22
|
+
url = URI('http://example.com')
|
|
23
|
+
|
|
24
|
+
adapter = described_class.new
|
|
25
|
+
|
|
26
|
+
http = adapter.send(:connection, url: url, request: {})
|
|
27
|
+
adapter.send(:configure_request, http, {})
|
|
28
|
+
|
|
29
|
+
# `max_retries=` is only present in Ruby 2.5
|
|
30
|
+
expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'allows to set pool_size on initialize' do
|
|
34
|
+
url = URI('https://example.com')
|
|
35
|
+
|
|
36
|
+
adapter = described_class.new(nil, pool_size: 5)
|
|
37
|
+
|
|
38
|
+
http = adapter.send(:connection, url: url, request: {})
|
|
39
|
+
|
|
40
|
+
# `pool` is only present in net_http_persistent >= 3.0
|
|
41
|
+
expect(http.pool.size).to eq(5) if http.respond_to?(:pool)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context 'min_version' do
|
|
45
|
+
it 'allows to set min_version in SSL settings' do
|
|
46
|
+
url = URI('https://example.com')
|
|
47
|
+
|
|
48
|
+
adapter = described_class.new(nil)
|
|
49
|
+
|
|
50
|
+
http = adapter.send(:connection, url: url, request: {})
|
|
51
|
+
adapter.send(:configure_ssl, http, min_version: :TLS1_2)
|
|
52
|
+
|
|
53
|
+
# `min_version` is only present in net_http_persistent >= 3.1 (UNRELEASED)
|
|
54
|
+
expect(http.min_version).to eq(:TLS1_2) if http.respond_to?(:min_version)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
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
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Faraday::AdapterRegistry do
|
|
4
|
+
describe '#initialize' do
|
|
5
|
+
subject(:registry) { described_class.new }
|
|
6
|
+
|
|
7
|
+
it { expect { registry.get(:FinFangFoom) }.to raise_error(NameError) }
|
|
8
|
+
it { expect { registry.get('FinFangFoom') }.to raise_error(NameError) }
|
|
9
|
+
|
|
10
|
+
it 'looks up class by string name' do
|
|
11
|
+
expect(registry.get('Faraday::Connection')).to eq(Faraday::Connection)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'looks up class by symbol name' do
|
|
15
|
+
expect(registry.get(:Faraday)).to eq(Faraday)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'caches lookups with implicit name' do
|
|
19
|
+
registry.set :symbol
|
|
20
|
+
expect(registry.get('symbol')).to eq(:symbol)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'caches lookups with explicit name' do
|
|
24
|
+
registry.set 'string', :name
|
|
25
|
+
expect(registry.get(:name)).to eq('string')
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Faraday::Adapter do
|
|
4
|
+
let(:adapter) { Faraday::Adapter.new }
|
|
5
|
+
let(:request) { {} }
|
|
6
|
+
|
|
7
|
+
context '#request_timeout' do
|
|
8
|
+
it 'gets :read timeout' do
|
|
9
|
+
expect(timeout(:read)).to eq(nil)
|
|
10
|
+
|
|
11
|
+
request[:timeout] = 5
|
|
12
|
+
request[:write_timeout] = 1
|
|
13
|
+
|
|
14
|
+
expect(timeout(:read)).to eq(5)
|
|
15
|
+
|
|
16
|
+
request[:read_timeout] = 2
|
|
17
|
+
|
|
18
|
+
expect(timeout(:read)).to eq(2)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'gets :open timeout' do
|
|
22
|
+
expect(timeout(:open)).to eq(nil)
|
|
23
|
+
|
|
24
|
+
request[:timeout] = 5
|
|
25
|
+
request[:write_timeout] = 1
|
|
26
|
+
|
|
27
|
+
expect(timeout(:open)).to eq(5)
|
|
28
|
+
|
|
29
|
+
request[:open_timeout] = 2
|
|
30
|
+
|
|
31
|
+
expect(timeout(:open)).to eq(2)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'gets :write timeout' do
|
|
35
|
+
expect(timeout(:write)).to eq(nil)
|
|
36
|
+
|
|
37
|
+
request[:timeout] = 5
|
|
38
|
+
request[:read_timeout] = 1
|
|
39
|
+
|
|
40
|
+
expect(timeout(:write)).to eq(5)
|
|
41
|
+
|
|
42
|
+
request[:write_timeout] = 2
|
|
43
|
+
|
|
44
|
+
expect(timeout(:write)).to eq(2)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'attempts unknown timeout type' do
|
|
48
|
+
expect { timeout(:unknown) }.to raise_error(ArgumentError)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def timeout(type)
|
|
52
|
+
adapter.send(:request_timeout, type, request)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|