oso-cloud 1.8.0 → 1.9.1.pre.vendored.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/.gitignore +0 -1
- data/Gemfile +5 -0
- data/Gemfile.lock +31 -12
- data/README.md +1 -1
- data/lib/oso/api.rb +18 -2
- data/lib/oso/oso.rb +10 -7
- data/lib/oso/version.rb +1 -1
- data/vendor/gems/faraday-2.5.2/CHANGELOG.md +574 -0
- data/vendor/gems/faraday-2.5.2/LICENSE.md +20 -0
- data/vendor/gems/faraday-2.5.2/README.md +55 -0
- data/vendor/gems/faraday-2.5.2/Rakefile +7 -0
- data/vendor/gems/faraday-2.5.2/examples/client_spec.rb +119 -0
- data/vendor/gems/faraday-2.5.2/examples/client_test.rb +144 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/adapter/test.rb +298 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/adapter.rb +102 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/adapter_registry.rb +30 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/connection.rb +561 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/encoders/flat_params_encoder.rb +105 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/encoders/nested_params_encoder.rb +183 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/error.rb +147 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/logging/formatter.rb +106 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/methods.rb +6 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/middleware.rb +30 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/middleware_registry.rb +83 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/connection_options.rb +22 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/env.rb +199 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/proxy_options.rb +32 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/request_options.rb +22 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/ssl_options.rb +69 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options.rb +218 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/parameters.rb +5 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/rack_builder.rb +252 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/authorization.rb +49 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/instrumentation.rb +56 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/json.rb +55 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/url_encoded.rb +60 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request.rb +136 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response/json.rb +54 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response/logger.rb +33 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response/raise_error.rb +64 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response.rb +90 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/utils/headers.rb +139 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/utils/params_hash.rb +61 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/utils.rb +122 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/version.rb +5 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday.rb +157 -0
- data/vendor/gems/faraday-2.5.2/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/adapter/test_spec.rb +413 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/adapter_registry_spec.rb +28 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/adapter_spec.rb +55 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/connection_spec.rb +793 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/error_spec.rb +60 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/middleware_registry_spec.rb +31 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/middleware_spec.rb +52 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/env_spec.rb +76 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/options_spec.rb +297 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/proxy_options_spec.rb +44 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/request_options_spec.rb +19 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/params_encoders/flat_spec.rb +42 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/params_encoders/nested_spec.rb +150 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/rack_builder_spec.rb +317 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/authorization_spec.rb +83 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/instrumentation_spec.rb +74 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/json_spec.rb +111 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/url_encoded_spec.rb +93 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request_spec.rb +110 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response/json_spec.rb +117 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response/logger_spec.rb +220 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response/raise_error_spec.rb +172 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response_spec.rb +75 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/utils/headers_spec.rb +82 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/utils_spec.rb +118 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday_spec.rb +37 -0
- data/vendor/gems/faraday-2.5.2/spec/spec_helper.rb +132 -0
- data/vendor/gems/faraday-2.5.2/spec/support/disabling_stub.rb +14 -0
- data/vendor/gems/faraday-2.5.2/spec/support/fake_safe_buffer.rb +15 -0
- data/vendor/gems/faraday-2.5.2/spec/support/helper_methods.rb +96 -0
- data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/adapter.rb +105 -0
- data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/params_encoder.rb +18 -0
- data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/request_method.rb +263 -0
- data/vendor/gems/faraday-2.5.2/spec/support/streaming_response_checker.rb +35 -0
- data/vendor/gems/faraday-net_http-3.0.2/LICENSE.md +21 -0
- data/vendor/gems/faraday-net_http-3.0.2/README.md +57 -0
- data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/adapter/net_http.rb +208 -0
- data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/net_http/version.rb +7 -0
- data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/net_http.rb +10 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/LICENSE.md +21 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/README.md +66 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/adapter/net_http_persistent.rb +234 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/net_http_persistent/version.rb +7 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/net_http_persistent.rb +18 -0
- data/vendor/gems/faraday-retry-2.0.0/CHANGELOG.md +24 -0
- data/vendor/gems/faraday-retry-2.0.0/LICENSE.md +21 -0
- data/vendor/gems/faraday-retry-2.0.0/README.md +169 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retriable_response.rb +8 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry/middleware.rb +254 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry/version.rb +7 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry.rb +13 -0
- data/vendor/gems/net-http-persistent-4.0.5/.autotest +9 -0
- data/vendor/gems/net-http-persistent-4.0.5/.gemtest +0 -0
- data/vendor/gems/net-http-persistent-4.0.5/Gemfile +14 -0
- data/vendor/gems/net-http-persistent-4.0.5/History.txt +460 -0
- data/vendor/gems/net-http-persistent-4.0.5/Manifest.txt +13 -0
- data/vendor/gems/net-http-persistent-4.0.5/README.rdoc +82 -0
- data/vendor/gems/net-http-persistent-4.0.5/Rakefile +25 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/connection.rb +41 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/pool.rb +65 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/timed_stack_multi.rb +79 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent.rb +1158 -0
- data/vendor/gems/net-http-persistent-4.0.5/test/test_net_http_persistent.rb +1512 -0
- data/vendor/gems/net-http-persistent-4.0.5/test/test_net_http_persistent_timed_stack_multi.rb +151 -0
- metadata +112 -8
@@ -0,0 +1,561 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# Connection objects manage the default properties and the middleware
|
5
|
+
# stack for fulfilling an HTTP request.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
#
|
9
|
+
# conn = Faraday::Connection.new 'http://httpbingo.org'
|
10
|
+
#
|
11
|
+
# # GET http://httpbingo.org/nigiri
|
12
|
+
# conn.get 'nigiri'
|
13
|
+
# # => #<Faraday::Response>
|
14
|
+
#
|
15
|
+
class Connection
|
16
|
+
# A Set of allowed HTTP verbs.
|
17
|
+
METHODS = Set.new %i[get post put delete head patch options trace]
|
18
|
+
USER_AGENT = "Faraday v#{VERSION}"
|
19
|
+
|
20
|
+
# @return [Hash] URI query unencoded key/value pairs.
|
21
|
+
attr_reader :params
|
22
|
+
|
23
|
+
# @return [Hash] unencoded HTTP header key/value pairs.
|
24
|
+
attr_reader :headers
|
25
|
+
|
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.
|
28
|
+
attr_reader :url_prefix
|
29
|
+
|
30
|
+
# @return [Faraday::RackBuilder] Builder for this Connection.
|
31
|
+
attr_reader :builder
|
32
|
+
|
33
|
+
# @return [Hash] SSL options.
|
34
|
+
attr_reader :ssl
|
35
|
+
|
36
|
+
# @return [Object] the parallel manager for this Connection.
|
37
|
+
attr_reader :parallel_manager
|
38
|
+
|
39
|
+
# Sets the default parallel manager for this connection.
|
40
|
+
attr_writer :default_parallel_manager
|
41
|
+
|
42
|
+
# @return [Hash] proxy options.
|
43
|
+
attr_reader :proxy
|
44
|
+
|
45
|
+
# Initializes a new Faraday::Connection.
|
46
|
+
#
|
47
|
+
# @param url [URI, String] URI or String base URL to use as a prefix for all
|
48
|
+
# requests (optional).
|
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
|
63
|
+
def initialize(url = nil, options = nil)
|
64
|
+
options = ConnectionOptions.from(options)
|
65
|
+
|
66
|
+
if url.is_a?(Hash) || url.is_a?(ConnectionOptions)
|
67
|
+
options = Utils.deep_merge(options, url)
|
68
|
+
url = options.url
|
69
|
+
end
|
70
|
+
|
71
|
+
@parallel_manager = nil
|
72
|
+
@headers = Utils::Headers.new
|
73
|
+
@params = Utils::ParamsHash.new
|
74
|
+
@options = options.request
|
75
|
+
@ssl = options.ssl
|
76
|
+
@default_parallel_manager = options.parallel_manager
|
77
|
+
@manual_proxy = nil
|
78
|
+
|
79
|
+
@builder = options.builder || begin
|
80
|
+
# pass an empty block to Builder so it doesn't assume default middleware
|
81
|
+
options.new_builder(block_given? ? proc { |b| } : nil)
|
82
|
+
end
|
83
|
+
|
84
|
+
self.url_prefix = url || 'http:/'
|
85
|
+
|
86
|
+
@params.update(options.params) if options.params
|
87
|
+
@headers.update(options.headers) if options.headers
|
88
|
+
|
89
|
+
initialize_proxy(url, options)
|
90
|
+
|
91
|
+
yield(self) if block_given?
|
92
|
+
|
93
|
+
@headers[:user_agent] ||= USER_AGENT
|
94
|
+
end
|
95
|
+
|
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]
|
108
|
+
def params=(hash)
|
109
|
+
@params.replace hash
|
110
|
+
end
|
111
|
+
|
112
|
+
# Sets the Hash of unencoded HTTP header key/value pairs.
|
113
|
+
# @param hash [Hash]
|
114
|
+
def headers=(hash)
|
115
|
+
@headers.replace hash
|
116
|
+
end
|
117
|
+
|
118
|
+
extend Forwardable
|
119
|
+
|
120
|
+
def_delegators :builder, :use, :request, :response, :adapter, :app
|
121
|
+
|
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
|
132
|
+
#
|
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.
|
137
|
+
#
|
138
|
+
# @example
|
139
|
+
# conn.get '/items', { page: 1 }, :accept => 'application/json'
|
140
|
+
#
|
141
|
+
# # ElasticSearch example sending a body with GET.
|
142
|
+
# conn.get '/twitter/tweet/_search' do |req|
|
143
|
+
# req.headers[:content_type] = 'application/json'
|
144
|
+
# req.params[:routing] = 'kimchy'
|
145
|
+
# req.body = JSON.generate(query: {...})
|
146
|
+
# end
|
147
|
+
#
|
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
|
154
|
+
#
|
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.
|
159
|
+
#
|
160
|
+
# @example
|
161
|
+
# conn.head '/items/1'
|
162
|
+
#
|
163
|
+
# @yield [Faraday::Request] for further request customizations
|
164
|
+
# @return [Faraday::Response]
|
165
|
+
|
166
|
+
# @!method delete(url = nil, params = nil, headers = nil)
|
167
|
+
# Makes a DELETE HTTP request without a body.
|
168
|
+
# @!scope class
|
169
|
+
#
|
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.
|
174
|
+
#
|
175
|
+
# @example
|
176
|
+
# conn.delete '/items/1'
|
177
|
+
#
|
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
|
184
|
+
#
|
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.
|
189
|
+
#
|
190
|
+
# @example
|
191
|
+
# conn.connect '/items/1'
|
192
|
+
#
|
193
|
+
# @yield [Faraday::Request] for further request customizations
|
194
|
+
# @return [Faraday::Response]
|
195
|
+
|
196
|
+
# @!visibility private
|
197
|
+
METHODS_WITH_QUERY.each do |method|
|
198
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
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
|
204
|
+
end
|
205
|
+
RUBY
|
206
|
+
end
|
207
|
+
|
208
|
+
# @overload options()
|
209
|
+
# Returns current Connection options.
|
210
|
+
#
|
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.
|
216
|
+
#
|
217
|
+
# @example
|
218
|
+
# conn.options '/items/1'
|
219
|
+
#
|
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
|
230
|
+
end
|
231
|
+
|
232
|
+
# @!method post(url = nil, body = nil, headers = nil)
|
233
|
+
# Makes a POST HTTP request with a body.
|
234
|
+
# @!scope class
|
235
|
+
#
|
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.
|
240
|
+
#
|
241
|
+
# @example
|
242
|
+
# conn.post '/items', data, content_type: 'application/json'
|
243
|
+
#
|
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
|
250
|
+
#
|
251
|
+
# @yield [Faraday::Request] for further request customizations
|
252
|
+
# @return [Faraday::Response]
|
253
|
+
|
254
|
+
# @!method put(url = nil, body = nil, headers = nil)
|
255
|
+
# Makes a PUT HTTP request with a body.
|
256
|
+
# @!scope class
|
257
|
+
#
|
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.
|
262
|
+
#
|
263
|
+
# @example
|
264
|
+
# # TODO: Make it a PUT example
|
265
|
+
# conn.post '/items', data, content_type: 'application/json'
|
266
|
+
#
|
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
|
273
|
+
#
|
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
|
284
|
+
end
|
285
|
+
|
286
|
+
# Check if the adapter is parallel-capable.
|
287
|
+
#
|
288
|
+
# @yield if the adapter isn't parallel-capable, or if no adapter is set yet.
|
289
|
+
#
|
290
|
+
# @return [Object, nil] a parallel manager or nil if yielded
|
291
|
+
# @api private
|
292
|
+
def default_parallel_manager
|
293
|
+
@default_parallel_manager ||= begin
|
294
|
+
adapter = @builder.adapter.klass if @builder.adapter
|
295
|
+
|
296
|
+
if support_parallel?(adapter)
|
297
|
+
adapter.setup_parallel_manager
|
298
|
+
elsif block_given?
|
299
|
+
yield
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
# Determine if this Faraday::Connection can make parallel requests.
|
305
|
+
#
|
306
|
+
# @return [Boolean]
|
307
|
+
def in_parallel?
|
308
|
+
!!@parallel_manager
|
309
|
+
end
|
310
|
+
|
311
|
+
# Sets up the parallel manager to make a set of requests.
|
312
|
+
#
|
313
|
+
# @param manager [Object] The parallel manager that this Connection's
|
314
|
+
# Adapter uses.
|
315
|
+
#
|
316
|
+
# @yield a block to execute multiple requests.
|
317
|
+
# @return [void]
|
318
|
+
def in_parallel(manager = nil)
|
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")
|
323
|
+
nil
|
324
|
+
end
|
325
|
+
yield
|
326
|
+
@parallel_manager&.run
|
327
|
+
ensure
|
328
|
+
@parallel_manager = nil
|
329
|
+
end
|
330
|
+
|
331
|
+
# Sets the Hash proxy options.
|
332
|
+
#
|
333
|
+
# @param new_value [Object]
|
334
|
+
def proxy=(new_value)
|
335
|
+
@manual_proxy = true
|
336
|
+
@proxy = new_value ? ProxyOptions.from(new_value) : nil
|
337
|
+
end
|
338
|
+
|
339
|
+
def_delegators :url_prefix, :scheme, :scheme=, :host, :host=, :port, :port=
|
340
|
+
def_delegator :url_prefix, :path, :path_prefix
|
341
|
+
|
342
|
+
# Parses the given URL with URI and stores the individual
|
343
|
+
# components in this connection. These components serve as defaults for
|
344
|
+
# requests made by this connection.
|
345
|
+
#
|
346
|
+
# @param url [String, URI]
|
347
|
+
# @param encoder [Object]
|
348
|
+
#
|
349
|
+
# @example
|
350
|
+
#
|
351
|
+
# conn = Faraday::Connection.new { ... }
|
352
|
+
# conn.url_prefix = "https://httpbingo.org/api"
|
353
|
+
# conn.scheme # => https
|
354
|
+
# conn.path_prefix # => "/api"
|
355
|
+
#
|
356
|
+
# conn.get("nigiri?page=2") # accesses https://httpbingo.org/api/nigiri
|
357
|
+
def url_prefix=(url, encoder = nil)
|
358
|
+
uri = @url_prefix = Utils.URI(url)
|
359
|
+
self.path_prefix = uri.path
|
360
|
+
|
361
|
+
params.merge_query(uri.query, encoder)
|
362
|
+
uri.query = nil
|
363
|
+
|
364
|
+
with_uri_credentials(uri) do |user, password|
|
365
|
+
set_basic_auth(user, password)
|
366
|
+
uri.user = uri.password = nil
|
367
|
+
end
|
368
|
+
|
369
|
+
@proxy = proxy_from_env(url) unless @manual_proxy
|
370
|
+
end
|
371
|
+
|
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
|
378
|
+
# slash.
|
379
|
+
#
|
380
|
+
# @param value [String]
|
381
|
+
#
|
382
|
+
# @return [String] the new path prefix
|
383
|
+
def path_prefix=(value)
|
384
|
+
url_prefix.path = if value
|
385
|
+
value = "/#{value}" unless value[0, 1] == '/'
|
386
|
+
value
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
# Takes a relative url for a request and combines it with the defaults
|
391
|
+
# set on the connection instance.
|
392
|
+
#
|
393
|
+
# @param url [String]
|
394
|
+
# @param extra_params [Hash]
|
395
|
+
#
|
396
|
+
# @example
|
397
|
+
# conn = Faraday::Connection.new { ... }
|
398
|
+
# conn.url_prefix = "https://httpbingo.org/api?token=abc"
|
399
|
+
# conn.scheme # => https
|
400
|
+
# conn.path_prefix # => "/api"
|
401
|
+
#
|
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
|
407
|
+
#
|
408
|
+
def build_url(url = nil, extra_params = nil)
|
409
|
+
uri = build_exclusive_url(url)
|
410
|
+
|
411
|
+
query_values = params.dup.merge_query(uri.query, options.params_encoder)
|
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
|
419
|
+
|
420
|
+
uri
|
421
|
+
end
|
422
|
+
|
423
|
+
# Builds and runs the Faraday::Request.
|
424
|
+
#
|
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.
|
430
|
+
#
|
431
|
+
# @return [Faraday::Response]
|
432
|
+
def run_request(method, url, body, headers)
|
433
|
+
unless METHODS.include?(method)
|
434
|
+
raise ArgumentError, "unknown http method: #{method}"
|
435
|
+
end
|
436
|
+
|
437
|
+
request = build_request(method) do |req|
|
438
|
+
req.options.proxy = proxy_for_request(url)
|
439
|
+
req.url(url) if url
|
440
|
+
req.headers.update(headers) if headers
|
441
|
+
req.body = body if body
|
442
|
+
yield(req) if block_given?
|
443
|
+
end
|
444
|
+
|
445
|
+
builder.build_response(self, request)
|
446
|
+
end
|
447
|
+
|
448
|
+
# Creates and configures the request object.
|
449
|
+
#
|
450
|
+
# @param method [Symbol]
|
451
|
+
#
|
452
|
+
# @yield [Faraday::Request] if block given
|
453
|
+
# @return [Faraday::Request]
|
454
|
+
def build_request(method)
|
455
|
+
Request.create(method) do |req|
|
456
|
+
req.params = params.dup
|
457
|
+
req.headers = headers.dup
|
458
|
+
req.options = options.dup
|
459
|
+
yield(req) if block_given?
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
# Build an absolute URL based on url_prefix.
|
464
|
+
#
|
465
|
+
# @param url [String, URI]
|
466
|
+
# @param params [Faraday::Utils::ParamsHash] A Faraday::Utils::ParamsHash to
|
467
|
+
# replace the query values
|
468
|
+
# of the resulting url (default: nil).
|
469
|
+
#
|
470
|
+
# @return [URI]
|
471
|
+
def build_exclusive_url(url = nil, params = nil, params_encoder = nil)
|
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
|
476
|
+
end
|
477
|
+
url = url.to_s.gsub(':', '%3A') if url && URI.parse(url.to_s).opaque
|
478
|
+
uri = url ? base + url : base
|
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?
|
483
|
+
uri
|
484
|
+
end
|
485
|
+
|
486
|
+
# Creates a duplicate of this Faraday::Connection.
|
487
|
+
#
|
488
|
+
# @api private
|
489
|
+
#
|
490
|
+
# @return [Faraday::Connection]
|
491
|
+
def dup
|
492
|
+
self.class.new(build_exclusive_url,
|
493
|
+
headers: headers.dup,
|
494
|
+
params: params.dup,
|
495
|
+
builder: builder.dup,
|
496
|
+
ssl: ssl.dup,
|
497
|
+
request: options.dup)
|
498
|
+
end
|
499
|
+
|
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
|
508
|
+
def with_uri_credentials(uri)
|
509
|
+
return unless uri.user && uri.password
|
510
|
+
|
511
|
+
yield(Utils.unescape(uri.user), Utils.unescape(uri.password))
|
512
|
+
end
|
513
|
+
|
514
|
+
def proxy_from_env(url)
|
515
|
+
return if Faraday.ignore_env_proxy
|
516
|
+
|
517
|
+
uri = nil
|
518
|
+
if URI.parse('').respond_to?(:find_proxy)
|
519
|
+
case url
|
520
|
+
when String
|
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
|
531
|
+
end
|
532
|
+
else
|
533
|
+
warn 'no_proxy is unsupported' if ENV['no_proxy'] || ENV['NO_PROXY']
|
534
|
+
uri = find_default_proxy
|
535
|
+
end
|
536
|
+
ProxyOptions.from(uri) if uri
|
537
|
+
end
|
538
|
+
|
539
|
+
def find_default_proxy
|
540
|
+
uri = ENV.fetch('http_proxy', nil)
|
541
|
+
return unless uri && !uri.empty?
|
542
|
+
|
543
|
+
uri = "http://#{uri}" unless uri.match?(/^http/i)
|
544
|
+
uri
|
545
|
+
end
|
546
|
+
|
547
|
+
def proxy_for_request(url)
|
548
|
+
return proxy if @manual_proxy
|
549
|
+
|
550
|
+
if url && Utils.URI(url).absolute?
|
551
|
+
proxy_from_env(url)
|
552
|
+
else
|
553
|
+
proxy
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
def support_parallel?(adapter)
|
558
|
+
adapter.respond_to?(:supports_parallel?) && adapter&.supports_parallel?
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# FlatParamsEncoder manages URI params as a flat hash. Any Array values repeat
|
5
|
+
# the parameter multiple times.
|
6
|
+
module FlatParamsEncoder
|
7
|
+
class << self
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :'Faraday::Utils', :escape, :unescape
|
10
|
+
end
|
11
|
+
|
12
|
+
# Encode converts the given param into a URI querystring. Keys and values
|
13
|
+
# will converted to strings and appropriately escaped for the URI.
|
14
|
+
#
|
15
|
+
# @param params [Hash] query arguments to convert.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
#
|
19
|
+
# encode({a: %w[one two three], b: true, c: "C"})
|
20
|
+
# # => 'a=one&a=two&a=three&b=true&c=C'
|
21
|
+
#
|
22
|
+
# @return [String] the URI querystring (without the leading '?')
|
23
|
+
def self.encode(params)
|
24
|
+
return nil if params.nil?
|
25
|
+
|
26
|
+
unless params.is_a?(Array)
|
27
|
+
unless params.respond_to?(:to_hash)
|
28
|
+
raise TypeError,
|
29
|
+
"Can't convert #{params.class} into Hash."
|
30
|
+
end
|
31
|
+
params = params.to_hash
|
32
|
+
params = params.map do |key, value|
|
33
|
+
key = key.to_s if key.is_a?(Symbol)
|
34
|
+
[key, value]
|
35
|
+
end
|
36
|
+
|
37
|
+
# Only to be used for non-Array inputs. Arrays should preserve order.
|
38
|
+
params.sort! if @sort_params
|
39
|
+
end
|
40
|
+
|
41
|
+
# The params have form [['key1', 'value1'], ['key2', 'value2']].
|
42
|
+
buffer = +''
|
43
|
+
params.each do |key, value|
|
44
|
+
encoded_key = escape(key)
|
45
|
+
if value.nil?
|
46
|
+
buffer << "#{encoded_key}&"
|
47
|
+
elsif value.is_a?(Array)
|
48
|
+
if value.empty?
|
49
|
+
buffer << "#{encoded_key}=&"
|
50
|
+
else
|
51
|
+
value.each do |sub_value|
|
52
|
+
encoded_value = escape(sub_value)
|
53
|
+
buffer << "#{encoded_key}=#{encoded_value}&"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
encoded_value = escape(value)
|
58
|
+
buffer << "#{encoded_key}=#{encoded_value}&"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
buffer.chop
|
62
|
+
end
|
63
|
+
|
64
|
+
# Decode converts the given URI querystring into a hash.
|
65
|
+
#
|
66
|
+
# @param query [String] query arguments to parse.
|
67
|
+
#
|
68
|
+
# @example
|
69
|
+
#
|
70
|
+
# decode('a=one&a=two&a=three&b=true&c=C')
|
71
|
+
# # => {"a"=>["one", "two", "three"], "b"=>"true", "c"=>"C"}
|
72
|
+
#
|
73
|
+
# @return [Hash] parsed keys and value strings from the querystring.
|
74
|
+
def self.decode(query)
|
75
|
+
return nil if query.nil?
|
76
|
+
|
77
|
+
empty_accumulator = {}
|
78
|
+
|
79
|
+
split_query = (query.split('&').map do |pair|
|
80
|
+
pair.split('=', 2) if pair && !pair.empty?
|
81
|
+
end).compact
|
82
|
+
split_query.each_with_object(empty_accumulator.dup) do |pair, accu|
|
83
|
+
pair[0] = unescape(pair[0])
|
84
|
+
pair[1] = true if pair[1].nil?
|
85
|
+
if pair[1].respond_to?(:to_str)
|
86
|
+
pair[1] = unescape(pair[1].to_str.tr('+', ' '))
|
87
|
+
end
|
88
|
+
if accu[pair[0]].is_a?(Array)
|
89
|
+
accu[pair[0]] << pair[1]
|
90
|
+
elsif accu[pair[0]]
|
91
|
+
accu[pair[0]] = [accu[pair[0]], pair[1]]
|
92
|
+
else
|
93
|
+
accu[pair[0]] = pair[1]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class << self
|
99
|
+
attr_accessor :sort_params
|
100
|
+
end
|
101
|
+
|
102
|
+
# Useful default for OAuth and caching.
|
103
|
+
@sort_params = true
|
104
|
+
end
|
105
|
+
end
|