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