faraday 0.17.6 → 1.10.3
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 +156 -8
- data/LICENSE.md +1 -1
- data/README.md +16 -358
- data/Rakefile +1 -7
- data/examples/client_spec.rb +97 -0
- data/examples/client_test.rb +118 -0
- data/lib/faraday/adapter/test.rb +118 -69
- data/lib/faraday/adapter/typhoeus.rb +4 -1
- data/lib/faraday/adapter.rb +72 -22
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/autoload.rb +39 -36
- data/lib/faraday/connection.rb +343 -185
- data/lib/faraday/dependency_loader.rb +39 -0
- data/lib/faraday/deprecate.rb +7 -6
- 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 +28 -40
- 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/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/options.rb +36 -191
- data/lib/faraday/parameters.rb +4 -197
- data/lib/faraday/rack_builder.rb +76 -64
- data/lib/faraday/request/authorization.rb +51 -30
- data/lib/faraday/request/basic_authentication.rb +14 -7
- data/lib/faraday/request/instrumentation.rb +45 -27
- data/lib/faraday/request/json.rb +55 -0
- data/lib/faraday/request/token_authentication.rb +15 -10
- data/lib/faraday/request/url_encoded.rb +43 -23
- data/lib/faraday/request.rb +82 -44
- data/lib/faraday/response/json.rb +54 -0
- data/lib/faraday/response/logger.rb +20 -69
- data/lib/faraday/response/raise_error.rb +49 -18
- data/lib/faraday/response.rb +26 -20
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +38 -247
- data/lib/faraday/version.rb +5 -0
- data/lib/faraday.rb +134 -188
- 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 +377 -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/deprecate_spec.rb +17 -17
- data/spec/faraday/error_spec.rb +12 -54
- 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 +96 -0
- data/spec/faraday/request/instrumentation_spec.rb +76 -0
- data/spec/faraday/request/json_spec.rb +111 -0
- data/spec/faraday/request/url_encoded_spec.rb +83 -0
- data/spec/faraday/request_spec.rb +120 -0
- data/spec/faraday/response/json_spec.rb +119 -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 +78 -15
- 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 +65 -36
- 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 +210 -56
- 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/parallel_manager.rb +0 -66
- data/lib/faraday/adapter/em_synchrony.rb +0 -106
- data/lib/faraday/adapter/excon.rb +0 -82
- data/lib/faraday/adapter/httpclient.rb +0 -128
- data/lib/faraday/adapter/net_http.rb +0 -153
- 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/request/multipart.rb +0 -68
- data/lib/faraday/request/retry.rb +0 -213
- data/lib/faraday/upload_io.rb +0 -77
- data/test/adapters/default_test.rb +0 -14
- data/test/adapters/em_http_test.rb +0 -30
- data/test/adapters/em_synchrony_test.rb +0 -32
- data/test/adapters/excon_test.rb +0 -30
- data/test/adapters/httpclient_test.rb +0 -34
- data/test/adapters/integration.rb +0 -263
- data/test/adapters/logger_test.rb +0 -136
- data/test/adapters/net_http_persistent_test.rb +0 -114
- data/test/adapters/net_http_test.rb +0 -79
- data/test/adapters/patron_test.rb +0 -40
- data/test/adapters/rack_test.rb +0 -38
- data/test/adapters/test_middleware_test.rb +0 -157
- data/test/adapters/typhoeus_test.rb +0 -38
- data/test/authentication_middleware_test.rb +0 -65
- data/test/composite_read_io_test.rb +0 -109
- data/test/connection_test.rb +0 -738
- data/test/env_test.rb +0 -268
- data/test/helper.rb +0 -75
- data/test/live_server.rb +0 -67
- data/test/middleware/instrumentation_test.rb +0 -88
- data/test/middleware/retry_test.rb +0 -282
- data/test/middleware_stack_test.rb +0 -260
- data/test/multibyte.txt +0 -1
- data/test/options_test.rb +0 -333
- data/test/parameters_test.rb +0 -157
- data/test/request_middleware_test.rb +0 -126
- data/test/response_middleware_test.rb +0 -72
- data/test/strawberry.rb +0 -2
- data/test/utils_test.rb +0 -98
data/lib/faraday/connection.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday/deprecate'
|
4
|
+
|
1
5
|
module Faraday
|
2
|
-
#
|
6
|
+
# Connection objects manage the default properties and the middleware
|
3
7
|
# stack for fulfilling an HTTP request.
|
4
8
|
#
|
5
|
-
#
|
9
|
+
# @example
|
6
10
|
#
|
7
11
|
# conn = Faraday::Connection.new 'http://sushi.com'
|
8
12
|
#
|
@@ -12,51 +16,52 @@ module Faraday
|
|
12
16
|
#
|
13
17
|
class Connection
|
14
18
|
# A Set of allowed HTTP verbs.
|
15
|
-
METHODS = Set.new [
|
19
|
+
METHODS = Set.new %i[get post put delete head patch options trace]
|
20
|
+
USER_AGENT = "Faraday v#{VERSION}"
|
16
21
|
|
17
|
-
#
|
22
|
+
# @return [Hash] URI query unencoded key/value pairs.
|
18
23
|
attr_reader :params
|
19
24
|
|
20
|
-
#
|
25
|
+
# @return [Hash] unencoded HTTP header key/value pairs.
|
21
26
|
attr_reader :headers
|
22
27
|
|
23
|
-
#
|
24
|
-
#
|
28
|
+
# @return [String] a URI with the prefix used for all requests from this
|
29
|
+
# Connection. This includes a default host name, scheme, port, and path.
|
25
30
|
attr_reader :url_prefix
|
26
31
|
|
27
|
-
#
|
32
|
+
# @return [Faraday::RackBuilder] Builder for this Connection.
|
28
33
|
attr_reader :builder
|
29
34
|
|
30
|
-
#
|
31
|
-
attr_reader :options
|
32
|
-
|
33
|
-
# Public: Returns a Hash of the SSL options.
|
35
|
+
# @return [Hash] SSL options.
|
34
36
|
attr_reader :ssl
|
35
37
|
|
36
|
-
#
|
38
|
+
# @return [Object] the parallel manager for this Connection.
|
37
39
|
attr_reader :parallel_manager
|
38
40
|
|
39
|
-
#
|
41
|
+
# Sets the default parallel manager for this connection.
|
40
42
|
attr_writer :default_parallel_manager
|
41
43
|
|
42
|
-
#
|
43
|
-
|
44
|
+
# @return [Hash] proxy options.
|
45
|
+
attr_reader :proxy
|
44
46
|
|
45
|
-
#
|
47
|
+
# Initializes a new Faraday::Connection.
|
46
48
|
#
|
47
|
-
# url
|
49
|
+
# @param url [URI, String] URI or String base URL to use as a prefix for all
|
48
50
|
# requests (optional).
|
49
|
-
# options
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
51
|
+
# @param options [Hash, Faraday::ConnectionOptions]
|
52
|
+
# @option options [URI, String] :url ('http:/') URI or String base URL
|
53
|
+
# @option options [Hash<String => String>] :params URI query unencoded
|
54
|
+
# key/value pairs.
|
55
|
+
# @option options [Hash<String => String>] :headers Hash of unencoded HTTP
|
56
|
+
# header key/value pairs.
|
57
|
+
# @option options [Hash] :request Hash of request options.
|
58
|
+
# @option options [Hash] :ssl Hash of SSL options.
|
59
|
+
# @option options [Hash, URI, String] :proxy proxy options, either as a URL
|
60
|
+
# or as a Hash
|
61
|
+
# @option options [URI, String] :proxy[:uri]
|
62
|
+
# @option options [String] :proxy[:user]
|
63
|
+
# @option options [String] :proxy[:password]
|
64
|
+
# @yield [self] after all setup has been done
|
60
65
|
def initialize(url = nil, options = nil)
|
61
66
|
options = ConnectionOptions.from(options)
|
62
67
|
|
@@ -71,10 +76,11 @@ module Faraday
|
|
71
76
|
@options = options.request
|
72
77
|
@ssl = options.ssl
|
73
78
|
@default_parallel_manager = options.parallel_manager
|
79
|
+
@manual_proxy = nil
|
74
80
|
|
75
81
|
@builder = options.builder || begin
|
76
82
|
# pass an empty block to Builder so it doesn't assume default middleware
|
77
|
-
options.new_builder(block_given? ?
|
83
|
+
options.new_builder(block_given? ? proc { |b| } : nil)
|
78
84
|
end
|
79
85
|
|
80
86
|
self.url_prefix = url || 'http:/'
|
@@ -82,21 +88,31 @@ module Faraday
|
|
82
88
|
@params.update(options.params) if options.params
|
83
89
|
@headers.update(options.headers) if options.headers
|
84
90
|
|
85
|
-
|
86
|
-
@proxy = options.proxy ? ProxyOptions.from(options.proxy) : proxy_from_env(url)
|
87
|
-
@temp_proxy = @proxy
|
91
|
+
initialize_proxy(url, options)
|
88
92
|
|
89
93
|
yield(self) if block_given?
|
90
94
|
|
91
|
-
@headers[:user_agent] ||=
|
95
|
+
@headers[:user_agent] ||= USER_AGENT
|
92
96
|
end
|
93
97
|
|
94
|
-
|
98
|
+
def initialize_proxy(url, options)
|
99
|
+
@manual_proxy = !!options.proxy
|
100
|
+
@proxy =
|
101
|
+
if options.proxy
|
102
|
+
ProxyOptions.from(options.proxy)
|
103
|
+
else
|
104
|
+
proxy_from_env(url)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Sets the Hash of URI query unencoded key/value pairs.
|
109
|
+
# @param hash [Hash]
|
95
110
|
def params=(hash)
|
96
111
|
@params.replace hash
|
97
112
|
end
|
98
113
|
|
99
|
-
#
|
114
|
+
# Sets the Hash of unencoded HTTP header key/value pairs.
|
115
|
+
# @param hash [Hash]
|
100
116
|
def headers=(hash)
|
101
117
|
@headers.replace hash
|
102
118
|
end
|
@@ -105,71 +121,163 @@ module Faraday
|
|
105
121
|
|
106
122
|
def_delegators :builder, :build, :use, :request, :response, :adapter, :app
|
107
123
|
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
|
112
|
-
|
113
|
-
|
124
|
+
# Closes the underlying resources and/or connections. In the case of
|
125
|
+
# persistent connections, this closes all currently open connections
|
126
|
+
# but does not prevent new connections from being made.
|
127
|
+
def close
|
128
|
+
app.close
|
129
|
+
end
|
130
|
+
|
131
|
+
# @!method get(url = nil, params = nil, headers = nil)
|
132
|
+
# Makes a GET HTTP request without a body.
|
133
|
+
# @!scope class
|
114
134
|
#
|
115
|
-
#
|
135
|
+
# @param url [String] The optional String base URL to use as a prefix for
|
136
|
+
# all requests. Can also be the options Hash.
|
137
|
+
# @param params [Hash] Hash of URI query unencoded key/value pairs.
|
138
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
116
139
|
#
|
117
|
-
#
|
118
|
-
# conn.
|
140
|
+
# @example
|
141
|
+
# conn.get '/items', { page: 1 }, :accept => 'application/json'
|
119
142
|
#
|
120
143
|
# # ElasticSearch example sending a body with GET.
|
121
144
|
# conn.get '/twitter/tweet/_search' do |req|
|
122
145
|
# req.headers[:content_type] = 'application/json'
|
123
146
|
# req.params[:routing] = 'kimchy'
|
124
|
-
# req.body = JSON.generate(:
|
147
|
+
# req.body = JSON.generate(query: {...})
|
125
148
|
# end
|
126
149
|
#
|
127
|
-
#
|
128
|
-
#
|
150
|
+
# @yield [Faraday::Request] for further request customizations
|
151
|
+
# @return [Faraday::Response]
|
152
|
+
|
153
|
+
# @!method head(url = nil, params = nil, headers = nil)
|
154
|
+
# Makes a HEAD HTTP request without a body.
|
155
|
+
# @!scope class
|
156
|
+
#
|
157
|
+
# @param url [String] The optional String base URL to use as a prefix for
|
158
|
+
# all requests. Can also be the options Hash.
|
159
|
+
# @param params [Hash] Hash of URI query unencoded key/value pairs.
|
160
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
161
|
+
#
|
162
|
+
# @example
|
163
|
+
# conn.head '/items/1'
|
164
|
+
#
|
165
|
+
# @yield [Faraday::Request] for further request customizations
|
166
|
+
# @return [Faraday::Response]
|
167
|
+
|
168
|
+
# @!method delete(url = nil, params = nil, headers = nil)
|
169
|
+
# Makes a DELETE HTTP request without a body.
|
170
|
+
# @!scope class
|
129
171
|
#
|
130
|
-
#
|
172
|
+
# @param url [String] The optional String base URL to use as a prefix for
|
173
|
+
# all requests. Can also be the options Hash.
|
174
|
+
# @param params [Hash] Hash of URI query unencoded key/value pairs.
|
175
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
131
176
|
#
|
132
|
-
#
|
177
|
+
# @example
|
178
|
+
# conn.delete '/items/1'
|
133
179
|
#
|
134
|
-
#
|
135
|
-
|
180
|
+
# @yield [Faraday::Request] for further request customizations
|
181
|
+
# @return [Faraday::Response]
|
182
|
+
|
183
|
+
# @!method trace(url = nil, params = nil, headers = nil)
|
184
|
+
# Makes a TRACE HTTP request without a body.
|
185
|
+
# @!scope class
|
186
|
+
#
|
187
|
+
# @param url [String] The optional String base URL to use as a prefix for
|
188
|
+
# all requests. Can also be the options Hash.
|
189
|
+
# @param params [Hash] Hash of URI query unencoded key/value pairs.
|
190
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
191
|
+
#
|
192
|
+
# @example
|
193
|
+
# conn.connect '/items/1'
|
194
|
+
#
|
195
|
+
# @yield [Faraday::Request] for further request customizations
|
196
|
+
# @return [Faraday::Response]
|
197
|
+
|
198
|
+
# @!visibility private
|
199
|
+
METHODS_WITH_QUERY.each do |method|
|
136
200
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
137
201
|
def #{method}(url = nil, params = nil, headers = nil)
|
138
|
-
run_request(:#{method}, url, nil, headers)
|
202
|
+
run_request(:#{method}, url, nil, headers) do |request|
|
139
203
|
request.params.update(params) if params
|
140
|
-
yield
|
141
|
-
|
204
|
+
yield request if block_given?
|
205
|
+
end
|
142
206
|
end
|
143
207
|
RUBY
|
144
208
|
end
|
145
209
|
|
146
|
-
#
|
210
|
+
# @overload options()
|
211
|
+
# Returns current Connection options.
|
147
212
|
#
|
148
|
-
# url
|
149
|
-
#
|
150
|
-
#
|
151
|
-
#
|
213
|
+
# @overload options(url, params = nil, headers = nil)
|
214
|
+
# Makes an OPTIONS HTTP request to the given URL.
|
215
|
+
# @param url [String] String base URL to sue as a prefix for all requests.
|
216
|
+
# @param params [Hash] Hash of URI query unencoded key/value pairs.
|
217
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
152
218
|
#
|
153
|
-
#
|
219
|
+
# @example
|
220
|
+
# conn.options '/items/1'
|
154
221
|
#
|
155
|
-
#
|
222
|
+
# @yield [Faraday::Request] for further request customizations
|
223
|
+
# @return [Faraday::Response]
|
224
|
+
def options(*args)
|
225
|
+
return @options if args.size.zero?
|
226
|
+
|
227
|
+
url, params, headers = *args
|
228
|
+
run_request(:options, url, nil, headers) do |request|
|
229
|
+
request.params.update(params) if params
|
230
|
+
yield request if block_given?
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# @!method post(url = nil, body = nil, headers = nil)
|
235
|
+
# Makes a POST HTTP request with a body.
|
236
|
+
# @!scope class
|
237
|
+
#
|
238
|
+
# @param url [String] The optional String base URL to use as a prefix for
|
239
|
+
# all requests. Can also be the options Hash.
|
240
|
+
# @param body [String] body for the request.
|
241
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
242
|
+
#
|
243
|
+
# @example
|
244
|
+
# conn.post '/items', data, content_type: 'application/json'
|
156
245
|
#
|
157
246
|
# # Simple ElasticSearch indexing sample.
|
158
247
|
# conn.post '/twitter/tweet' do |req|
|
159
248
|
# req.headers[:content_type] = 'application/json'
|
160
249
|
# req.params[:routing] = 'kimchy'
|
161
|
-
# req.body = JSON.generate(:
|
250
|
+
# req.body = JSON.generate(user: 'kimchy', ...)
|
162
251
|
# end
|
163
252
|
#
|
164
|
-
#
|
165
|
-
#
|
253
|
+
# @yield [Faraday::Request] for further request customizations
|
254
|
+
# @return [Faraday::Response]
|
255
|
+
|
256
|
+
# @!method put(url = nil, body = nil, headers = nil)
|
257
|
+
# Makes a PUT HTTP request with a body.
|
258
|
+
# @!scope class
|
259
|
+
#
|
260
|
+
# @param url [String] The optional String base URL to use as a prefix for
|
261
|
+
# all requests. Can also be the options Hash.
|
262
|
+
# @param body [String] body for the request.
|
263
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
166
264
|
#
|
167
|
-
#
|
265
|
+
# @example
|
266
|
+
# # TODO: Make it a PUT example
|
267
|
+
# conn.post '/items', data, content_type: 'application/json'
|
168
268
|
#
|
169
|
-
#
|
269
|
+
# # Simple ElasticSearch indexing sample.
|
270
|
+
# conn.post '/twitter/tweet' do |req|
|
271
|
+
# req.headers[:content_type] = 'application/json'
|
272
|
+
# req.params[:routing] = 'kimchy'
|
273
|
+
# req.body = JSON.generate(user: 'kimchy', ...)
|
274
|
+
# end
|
170
275
|
#
|
171
|
-
#
|
172
|
-
|
276
|
+
# @yield [Faraday::Request] for further request customizations
|
277
|
+
# @return [Faraday::Response]
|
278
|
+
|
279
|
+
# @!visibility private
|
280
|
+
METHODS_WITH_BODY.each do |method|
|
173
281
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
174
282
|
def #{method}(url = nil, body = nil, headers = nil, &block)
|
175
283
|
run_request(:#{method}, url, body, headers, &block)
|
@@ -177,116 +285,123 @@ module Faraday
|
|
177
285
|
RUBY
|
178
286
|
end
|
179
287
|
|
180
|
-
#
|
288
|
+
# Sets up the Authorization header with these credentials, encoded
|
181
289
|
# with base64.
|
182
290
|
#
|
183
|
-
# login
|
184
|
-
# pass
|
291
|
+
# @param login [String] The authentication login.
|
292
|
+
# @param pass [String] The authentication password.
|
185
293
|
#
|
186
|
-
#
|
294
|
+
# @example
|
187
295
|
#
|
188
296
|
# conn.basic_auth 'Aladdin', 'open sesame'
|
189
297
|
# conn.headers['Authorization']
|
190
298
|
# # => "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
|
191
299
|
#
|
192
|
-
#
|
300
|
+
# @return [void]
|
193
301
|
def basic_auth(login, pass)
|
194
302
|
set_authorization_header(:basic_auth, login, pass)
|
195
303
|
end
|
196
304
|
|
197
|
-
|
305
|
+
extend Faraday::Deprecate
|
306
|
+
deprecate :basic_auth, '#request(:basic_auth, ...)', '2.0'
|
307
|
+
|
308
|
+
# Sets up the Authorization header with the given token.
|
198
309
|
#
|
199
|
-
# token
|
200
|
-
# options
|
310
|
+
# @param token [String]
|
311
|
+
# @param options [Hash] extra token options.
|
201
312
|
#
|
202
|
-
#
|
313
|
+
# @example
|
203
314
|
#
|
204
|
-
# conn.token_auth 'abcdef', :
|
315
|
+
# conn.token_auth 'abcdef', foo: 'bar'
|
205
316
|
# conn.headers['Authorization']
|
206
317
|
# # => "Token token=\"abcdef\",
|
207
318
|
# foo=\"bar\""
|
208
319
|
#
|
209
|
-
#
|
320
|
+
# @return [void]
|
210
321
|
def token_auth(token, options = nil)
|
211
322
|
set_authorization_header(:token_auth, token, options)
|
212
323
|
end
|
213
324
|
|
214
|
-
|
325
|
+
deprecate :token_auth,
|
326
|
+
'#request(:token_auth, ...)',
|
327
|
+
'2.0',
|
328
|
+
'See https://lostisland.github.io/faraday/middleware/authentication for more usage info.'
|
329
|
+
|
330
|
+
# Sets up a custom Authorization header.
|
215
331
|
#
|
216
|
-
# type
|
217
|
-
# token
|
218
|
-
# a Hash is encoded into comma
|
332
|
+
# @param type [String] authorization type
|
333
|
+
# @param token [String, Hash] token. A String value is taken literally, and
|
334
|
+
# a Hash is encoded into comma-separated key/value pairs.
|
219
335
|
#
|
220
|
-
#
|
336
|
+
# @example
|
221
337
|
#
|
222
338
|
# conn.authorization :Bearer, 'mF_9.B5f-4.1JqM'
|
223
339
|
# conn.headers['Authorization']
|
224
340
|
# # => "Bearer mF_9.B5f-4.1JqM"
|
225
341
|
#
|
226
|
-
# conn.authorization :Token, :
|
342
|
+
# conn.authorization :Token, token: 'abcdef', foo: 'bar'
|
227
343
|
# conn.headers['Authorization']
|
228
344
|
# # => "Token token=\"abcdef\",
|
229
345
|
# foo=\"bar\""
|
230
346
|
#
|
231
|
-
#
|
347
|
+
# @return [void]
|
232
348
|
def authorization(type, token)
|
233
349
|
set_authorization_header(:authorization, type, token)
|
234
350
|
end
|
235
351
|
|
236
|
-
|
237
|
-
|
352
|
+
deprecate :authorization,
|
353
|
+
'#request(:authorization, ...)',
|
354
|
+
'2.0',
|
355
|
+
'See https://lostisland.github.io/faraday/middleware/authentication for more usage info.'
|
356
|
+
|
357
|
+
# Check if the adapter is parallel-capable.
|
238
358
|
#
|
239
|
-
#
|
359
|
+
# @yield if the adapter isn't parallel-capable, or if no adapter is set yet.
|
240
360
|
#
|
241
|
-
#
|
361
|
+
# @return [Object, nil] a parallel manager or nil if yielded
|
362
|
+
# @api private
|
242
363
|
def default_parallel_manager
|
243
364
|
@default_parallel_manager ||= begin
|
244
|
-
|
245
|
-
h.klass.respond_to?(:supports_parallel?) and h.klass.supports_parallel?
|
246
|
-
end
|
365
|
+
adapter = @builder.adapter.klass if @builder.adapter
|
247
366
|
|
248
|
-
if
|
249
|
-
|
367
|
+
if support_parallel?(adapter)
|
368
|
+
adapter.setup_parallel_manager
|
250
369
|
elsif block_given?
|
251
370
|
yield
|
252
371
|
end
|
253
372
|
end
|
254
373
|
end
|
255
374
|
|
256
|
-
#
|
375
|
+
# Determine if this Faraday::Connection can make parallel requests.
|
257
376
|
#
|
258
|
-
#
|
377
|
+
# @return [Boolean]
|
259
378
|
def in_parallel?
|
260
379
|
!!@parallel_manager
|
261
380
|
end
|
262
381
|
|
263
|
-
#
|
382
|
+
# Sets up the parallel manager to make a set of requests.
|
264
383
|
#
|
265
|
-
# manager
|
384
|
+
# @param manager [Object] The parallel manager that this Connection's
|
385
|
+
# Adapter uses.
|
266
386
|
#
|
267
|
-
#
|
268
|
-
#
|
387
|
+
# @yield a block to execute multiple requests.
|
388
|
+
# @return [void]
|
269
389
|
def in_parallel(manager = nil)
|
270
|
-
@parallel_manager = manager || default_parallel_manager
|
271
|
-
warn
|
272
|
-
|
390
|
+
@parallel_manager = manager || default_parallel_manager do
|
391
|
+
warn 'Warning: `in_parallel` called but no parallel-capable adapter ' \
|
392
|
+
'on Faraday stack'
|
393
|
+
warn caller[2, 10].join("\n")
|
273
394
|
nil
|
274
|
-
|
395
|
+
end
|
275
396
|
yield
|
276
|
-
@parallel_manager
|
397
|
+
@parallel_manager&.run
|
277
398
|
ensure
|
278
399
|
@parallel_manager = nil
|
279
400
|
end
|
280
401
|
|
281
|
-
#
|
282
|
-
|
283
|
-
|
284
|
-
warn 'Warning: use of proxy(new_value) to set connection proxy have been DEPRECATED and will be removed in Faraday 1.0'
|
285
|
-
@manual_proxy = true
|
286
|
-
@proxy = ProxyOptions.from(arg)
|
287
|
-
end
|
288
|
-
|
289
|
-
# Public: Sets the Hash proxy options.
|
402
|
+
# Sets the Hash proxy options.
|
403
|
+
#
|
404
|
+
# @param new_value [Object]
|
290
405
|
def proxy=(new_value)
|
291
406
|
@manual_proxy = true
|
292
407
|
@proxy = new_value ? ProxyOptions.from(new_value) : nil
|
@@ -295,13 +410,14 @@ module Faraday
|
|
295
410
|
def_delegators :url_prefix, :scheme, :scheme=, :host, :host=, :port, :port=
|
296
411
|
def_delegator :url_prefix, :path, :path_prefix
|
297
412
|
|
298
|
-
#
|
299
|
-
# components in this connection.
|
413
|
+
# Parses the given URL with URI and stores the individual
|
414
|
+
# components in this connection. These components serve as defaults for
|
300
415
|
# requests made by this connection.
|
301
416
|
#
|
302
|
-
# url
|
417
|
+
# @param url [String, URI]
|
418
|
+
# @param encoder [Object]
|
303
419
|
#
|
304
|
-
#
|
420
|
+
# @example
|
305
421
|
#
|
306
422
|
# conn = Faraday::Connection.new { ... }
|
307
423
|
# conn.url_prefix = "https://sushi.com/api"
|
@@ -309,8 +425,6 @@ module Faraday
|
|
309
425
|
# conn.path_prefix # => "/api"
|
310
426
|
#
|
311
427
|
# conn.get("nigiri?page=2") # accesses https://sushi.com/api/nigiri
|
312
|
-
#
|
313
|
-
# Returns the parsed URI from the given input..
|
314
428
|
def url_prefix=(url, encoder = nil)
|
315
429
|
uri = @url_prefix = Utils.URI(url)
|
316
430
|
self.path_prefix = uri.path
|
@@ -319,65 +433,80 @@ module Faraday
|
|
319
433
|
uri.query = nil
|
320
434
|
|
321
435
|
with_uri_credentials(uri) do |user, password|
|
322
|
-
|
436
|
+
set_basic_auth(user, password)
|
323
437
|
uri.user = uri.password = nil
|
324
438
|
end
|
325
439
|
|
326
|
-
|
440
|
+
@proxy = proxy_from_env(url) unless @manual_proxy
|
327
441
|
end
|
328
442
|
|
329
|
-
|
443
|
+
def set_basic_auth(user, password)
|
444
|
+
header = Faraday::Request::BasicAuthentication.header(user, password)
|
445
|
+
headers[Faraday::Request::Authorization::KEY] = header
|
446
|
+
end
|
447
|
+
|
448
|
+
# Sets the path prefix and ensures that it always has a leading
|
330
449
|
# slash.
|
331
450
|
#
|
332
|
-
# value
|
451
|
+
# @param value [String]
|
333
452
|
#
|
334
|
-
#
|
453
|
+
# @return [String] the new path prefix
|
335
454
|
def path_prefix=(value)
|
336
455
|
url_prefix.path = if value
|
337
|
-
|
338
|
-
|
339
|
-
|
456
|
+
value = "/#{value}" unless value[0, 1] == '/'
|
457
|
+
value
|
458
|
+
end
|
340
459
|
end
|
341
460
|
|
342
|
-
#
|
461
|
+
# Takes a relative url for a request and combines it with the defaults
|
343
462
|
# set on the connection instance.
|
344
463
|
#
|
464
|
+
# @param url [String]
|
465
|
+
# @param extra_params [Hash]
|
466
|
+
#
|
467
|
+
# @example
|
345
468
|
# conn = Faraday::Connection.new { ... }
|
346
469
|
# conn.url_prefix = "https://sushi.com/api?token=abc"
|
347
470
|
# conn.scheme # => https
|
348
471
|
# conn.path_prefix # => "/api"
|
349
472
|
#
|
350
|
-
# conn.build_url("nigiri?page=2")
|
351
|
-
#
|
473
|
+
# conn.build_url("nigiri?page=2")
|
474
|
+
# # => https://sushi.com/api/nigiri?token=abc&page=2
|
475
|
+
#
|
476
|
+
# conn.build_url("nigiri", page: 2)
|
477
|
+
# # => https://sushi.com/api/nigiri?token=abc&page=2
|
352
478
|
#
|
353
479
|
def build_url(url = nil, extra_params = nil)
|
354
480
|
uri = build_exclusive_url(url)
|
355
481
|
|
356
482
|
query_values = params.dup.merge_query(uri.query, options.params_encoder)
|
357
|
-
query_values.update
|
358
|
-
uri.query =
|
483
|
+
query_values.update(extra_params) if extra_params
|
484
|
+
uri.query =
|
485
|
+
if query_values.empty?
|
486
|
+
nil
|
487
|
+
else
|
488
|
+
query_values.to_query(options.params_encoder)
|
489
|
+
end
|
359
490
|
|
360
491
|
uri
|
361
492
|
end
|
362
493
|
|
363
494
|
# Builds and runs the Faraday::Request.
|
364
495
|
#
|
365
|
-
# method
|
366
|
-
# url
|
367
|
-
# body
|
368
|
-
#
|
496
|
+
# @param method [Symbol] HTTP method.
|
497
|
+
# @param url [String, URI] String or URI to access.
|
498
|
+
# @param body [Object] The request body that will eventually be converted to
|
499
|
+
# a string.
|
500
|
+
# @param headers [Hash] unencoded HTTP header key/value pairs.
|
369
501
|
#
|
370
|
-
#
|
502
|
+
# @return [Faraday::Response]
|
371
503
|
def run_request(method, url, body, headers)
|
372
|
-
|
504
|
+
unless METHODS.include?(method)
|
373
505
|
raise ArgumentError, "unknown http method: #{method}"
|
374
506
|
end
|
375
507
|
|
376
|
-
# Resets temp_proxy
|
377
|
-
@temp_proxy = proxy_for_request(url)
|
378
|
-
|
379
508
|
request = build_request(method) do |req|
|
380
|
-
req.options =
|
509
|
+
req.options.proxy = proxy_for_request(url)
|
381
510
|
req.url(url) if url
|
382
511
|
req.headers.update(headers) if headers
|
383
512
|
req.body = body if body
|
@@ -389,73 +518,97 @@ module Faraday
|
|
389
518
|
|
390
519
|
# Creates and configures the request object.
|
391
520
|
#
|
392
|
-
#
|
521
|
+
# @param method [Symbol]
|
522
|
+
#
|
523
|
+
# @yield [Faraday::Request] if block given
|
524
|
+
# @return [Faraday::Request]
|
393
525
|
def build_request(method)
|
394
526
|
Request.create(method) do |req|
|
395
|
-
req.params =
|
396
|
-
req.headers =
|
397
|
-
req.options =
|
527
|
+
req.params = params.dup
|
528
|
+
req.headers = headers.dup
|
529
|
+
req.options = options.dup
|
398
530
|
yield(req) if block_given?
|
399
531
|
end
|
400
532
|
end
|
401
533
|
|
402
|
-
#
|
534
|
+
# Build an absolute URL based on url_prefix.
|
403
535
|
#
|
404
|
-
# url
|
405
|
-
# params
|
536
|
+
# @param url [String, URI]
|
537
|
+
# @param params [Faraday::Utils::ParamsHash] A Faraday::Utils::ParamsHash to
|
538
|
+
# replace the query values
|
406
539
|
# of the resulting url (default: nil).
|
407
540
|
#
|
408
|
-
#
|
541
|
+
# @return [URI]
|
409
542
|
def build_exclusive_url(url = nil, params = nil, params_encoder = nil)
|
410
|
-
url = nil if url.respond_to?(:empty?)
|
411
|
-
base = url_prefix
|
412
|
-
if url
|
413
|
-
base = base.
|
414
|
-
base.path = base.path + '/' # ensure trailing slash
|
543
|
+
url = nil if url.respond_to?(:empty?) && url.empty?
|
544
|
+
base = url_prefix.dup
|
545
|
+
if url && base.path && base.path !~ %r{/$}
|
546
|
+
base.path = "#{base.path}/" # ensure trailing slash
|
415
547
|
end
|
548
|
+
url = url && URI.parse(url.to_s).opaque ? url.to_s.gsub(':', '%3A') : url
|
416
549
|
uri = url ? base + url : base
|
417
|
-
|
418
|
-
|
550
|
+
if params
|
551
|
+
uri.query = params.to_query(params_encoder || options.params_encoder)
|
552
|
+
end
|
553
|
+
# rubocop:disable Style/SafeNavigation
|
554
|
+
uri.query = nil if uri.query && uri.query.empty?
|
555
|
+
# rubocop:enable Style/SafeNavigation
|
419
556
|
uri
|
420
557
|
end
|
421
558
|
|
422
|
-
#
|
559
|
+
# Creates a duplicate of this Faraday::Connection.
|
423
560
|
#
|
424
|
-
#
|
561
|
+
# @api private
|
562
|
+
#
|
563
|
+
# @return [Faraday::Connection]
|
425
564
|
def dup
|
426
565
|
self.class.new(build_exclusive_url,
|
427
|
-
:
|
428
|
-
:
|
429
|
-
:
|
430
|
-
:
|
431
|
-
:
|
566
|
+
headers: headers.dup,
|
567
|
+
params: params.dup,
|
568
|
+
builder: builder.dup,
|
569
|
+
ssl: ssl.dup,
|
570
|
+
request: options.dup)
|
432
571
|
end
|
433
572
|
|
434
|
-
#
|
573
|
+
# Yields username and password extracted from a URI if they both exist.
|
574
|
+
#
|
575
|
+
# @param uri [URI]
|
576
|
+
# @yield [username, password] any username and password
|
577
|
+
# @yieldparam username [String] any username from URI
|
578
|
+
# @yieldparam password [String] any password from URI
|
579
|
+
# @return [void]
|
580
|
+
# @api private
|
435
581
|
def with_uri_credentials(uri)
|
436
|
-
|
437
|
-
|
438
|
-
|
582
|
+
return unless uri.user && uri.password
|
583
|
+
|
584
|
+
yield(Utils.unescape(uri.user), Utils.unescape(uri.password))
|
439
585
|
end
|
440
586
|
|
441
587
|
def set_authorization_header(header_type, *args)
|
442
|
-
header = Faraday::Request
|
443
|
-
|
588
|
+
header = Faraday::Request
|
589
|
+
.lookup_middleware(header_type)
|
590
|
+
.header(*args)
|
591
|
+
|
444
592
|
headers[Faraday::Request::Authorization::KEY] = header
|
445
593
|
end
|
446
594
|
|
447
595
|
def proxy_from_env(url)
|
448
596
|
return if Faraday.ignore_env_proxy
|
597
|
+
|
449
598
|
uri = nil
|
450
599
|
if URI.parse('').respond_to?(:find_proxy)
|
451
600
|
case url
|
452
601
|
when String
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
602
|
+
uri = Utils.URI(url)
|
603
|
+
uri = if uri.host.nil?
|
604
|
+
find_default_proxy
|
605
|
+
else
|
606
|
+
URI.parse("#{uri.scheme}://#{uri.host}").find_proxy
|
607
|
+
end
|
608
|
+
when URI
|
609
|
+
uri = url.find_proxy
|
610
|
+
when nil
|
611
|
+
uri = find_default_proxy
|
459
612
|
end
|
460
613
|
else
|
461
614
|
warn 'no_proxy is unsupported' if ENV['no_proxy'] || ENV['NO_PROXY']
|
@@ -466,19 +619,24 @@ module Faraday
|
|
466
619
|
|
467
620
|
def find_default_proxy
|
468
621
|
uri = ENV['http_proxy']
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
622
|
+
return unless uri && !uri.empty?
|
623
|
+
|
624
|
+
uri = "http://#{uri}" unless uri.match?(/^http/i)
|
625
|
+
uri
|
473
626
|
end
|
474
627
|
|
475
628
|
def proxy_for_request(url)
|
476
|
-
return
|
629
|
+
return proxy if @manual_proxy
|
630
|
+
|
477
631
|
if url && Utils.URI(url).absolute?
|
478
632
|
proxy_from_env(url)
|
479
633
|
else
|
480
|
-
|
634
|
+
proxy
|
481
635
|
end
|
482
636
|
end
|
637
|
+
|
638
|
+
def support_parallel?(adapter)
|
639
|
+
adapter&.respond_to?(:supports_parallel?) && adapter&.supports_parallel?
|
640
|
+
end
|
483
641
|
end
|
484
642
|
end
|