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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/Gemfile +5 -0
  4. data/Gemfile.lock +31 -12
  5. data/README.md +1 -1
  6. data/lib/oso/api.rb +18 -2
  7. data/lib/oso/oso.rb +10 -7
  8. data/lib/oso/version.rb +1 -1
  9. data/vendor/gems/faraday-2.5.2/CHANGELOG.md +574 -0
  10. data/vendor/gems/faraday-2.5.2/LICENSE.md +20 -0
  11. data/vendor/gems/faraday-2.5.2/README.md +55 -0
  12. data/vendor/gems/faraday-2.5.2/Rakefile +7 -0
  13. data/vendor/gems/faraday-2.5.2/examples/client_spec.rb +119 -0
  14. data/vendor/gems/faraday-2.5.2/examples/client_test.rb +144 -0
  15. data/vendor/gems/faraday-2.5.2/lib/faraday/adapter/test.rb +298 -0
  16. data/vendor/gems/faraday-2.5.2/lib/faraday/adapter.rb +102 -0
  17. data/vendor/gems/faraday-2.5.2/lib/faraday/adapter_registry.rb +30 -0
  18. data/vendor/gems/faraday-2.5.2/lib/faraday/connection.rb +561 -0
  19. data/vendor/gems/faraday-2.5.2/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  20. data/vendor/gems/faraday-2.5.2/lib/faraday/encoders/nested_params_encoder.rb +183 -0
  21. data/vendor/gems/faraday-2.5.2/lib/faraday/error.rb +147 -0
  22. data/vendor/gems/faraday-2.5.2/lib/faraday/logging/formatter.rb +106 -0
  23. data/vendor/gems/faraday-2.5.2/lib/faraday/methods.rb +6 -0
  24. data/vendor/gems/faraday-2.5.2/lib/faraday/middleware.rb +30 -0
  25. data/vendor/gems/faraday-2.5.2/lib/faraday/middleware_registry.rb +83 -0
  26. data/vendor/gems/faraday-2.5.2/lib/faraday/options/connection_options.rb +22 -0
  27. data/vendor/gems/faraday-2.5.2/lib/faraday/options/env.rb +199 -0
  28. data/vendor/gems/faraday-2.5.2/lib/faraday/options/proxy_options.rb +32 -0
  29. data/vendor/gems/faraday-2.5.2/lib/faraday/options/request_options.rb +22 -0
  30. data/vendor/gems/faraday-2.5.2/lib/faraday/options/ssl_options.rb +69 -0
  31. data/vendor/gems/faraday-2.5.2/lib/faraday/options.rb +218 -0
  32. data/vendor/gems/faraday-2.5.2/lib/faraday/parameters.rb +5 -0
  33. data/vendor/gems/faraday-2.5.2/lib/faraday/rack_builder.rb +252 -0
  34. data/vendor/gems/faraday-2.5.2/lib/faraday/request/authorization.rb +49 -0
  35. data/vendor/gems/faraday-2.5.2/lib/faraday/request/instrumentation.rb +56 -0
  36. data/vendor/gems/faraday-2.5.2/lib/faraday/request/json.rb +55 -0
  37. data/vendor/gems/faraday-2.5.2/lib/faraday/request/url_encoded.rb +60 -0
  38. data/vendor/gems/faraday-2.5.2/lib/faraday/request.rb +136 -0
  39. data/vendor/gems/faraday-2.5.2/lib/faraday/response/json.rb +54 -0
  40. data/vendor/gems/faraday-2.5.2/lib/faraday/response/logger.rb +33 -0
  41. data/vendor/gems/faraday-2.5.2/lib/faraday/response/raise_error.rb +64 -0
  42. data/vendor/gems/faraday-2.5.2/lib/faraday/response.rb +90 -0
  43. data/vendor/gems/faraday-2.5.2/lib/faraday/utils/headers.rb +139 -0
  44. data/vendor/gems/faraday-2.5.2/lib/faraday/utils/params_hash.rb +61 -0
  45. data/vendor/gems/faraday-2.5.2/lib/faraday/utils.rb +122 -0
  46. data/vendor/gems/faraday-2.5.2/lib/faraday/version.rb +5 -0
  47. data/vendor/gems/faraday-2.5.2/lib/faraday.rb +157 -0
  48. data/vendor/gems/faraday-2.5.2/spec/external_adapters/faraday_specs_setup.rb +14 -0
  49. data/vendor/gems/faraday-2.5.2/spec/faraday/adapter/test_spec.rb +413 -0
  50. data/vendor/gems/faraday-2.5.2/spec/faraday/adapter_registry_spec.rb +28 -0
  51. data/vendor/gems/faraday-2.5.2/spec/faraday/adapter_spec.rb +55 -0
  52. data/vendor/gems/faraday-2.5.2/spec/faraday/connection_spec.rb +793 -0
  53. data/vendor/gems/faraday-2.5.2/spec/faraday/error_spec.rb +60 -0
  54. data/vendor/gems/faraday-2.5.2/spec/faraday/middleware_registry_spec.rb +31 -0
  55. data/vendor/gems/faraday-2.5.2/spec/faraday/middleware_spec.rb +52 -0
  56. data/vendor/gems/faraday-2.5.2/spec/faraday/options/env_spec.rb +76 -0
  57. data/vendor/gems/faraday-2.5.2/spec/faraday/options/options_spec.rb +297 -0
  58. data/vendor/gems/faraday-2.5.2/spec/faraday/options/proxy_options_spec.rb +44 -0
  59. data/vendor/gems/faraday-2.5.2/spec/faraday/options/request_options_spec.rb +19 -0
  60. data/vendor/gems/faraday-2.5.2/spec/faraday/params_encoders/flat_spec.rb +42 -0
  61. data/vendor/gems/faraday-2.5.2/spec/faraday/params_encoders/nested_spec.rb +150 -0
  62. data/vendor/gems/faraday-2.5.2/spec/faraday/rack_builder_spec.rb +317 -0
  63. data/vendor/gems/faraday-2.5.2/spec/faraday/request/authorization_spec.rb +83 -0
  64. data/vendor/gems/faraday-2.5.2/spec/faraday/request/instrumentation_spec.rb +74 -0
  65. data/vendor/gems/faraday-2.5.2/spec/faraday/request/json_spec.rb +111 -0
  66. data/vendor/gems/faraday-2.5.2/spec/faraday/request/url_encoded_spec.rb +93 -0
  67. data/vendor/gems/faraday-2.5.2/spec/faraday/request_spec.rb +110 -0
  68. data/vendor/gems/faraday-2.5.2/spec/faraday/response/json_spec.rb +117 -0
  69. data/vendor/gems/faraday-2.5.2/spec/faraday/response/logger_spec.rb +220 -0
  70. data/vendor/gems/faraday-2.5.2/spec/faraday/response/raise_error_spec.rb +172 -0
  71. data/vendor/gems/faraday-2.5.2/spec/faraday/response_spec.rb +75 -0
  72. data/vendor/gems/faraday-2.5.2/spec/faraday/utils/headers_spec.rb +82 -0
  73. data/vendor/gems/faraday-2.5.2/spec/faraday/utils_spec.rb +118 -0
  74. data/vendor/gems/faraday-2.5.2/spec/faraday_spec.rb +37 -0
  75. data/vendor/gems/faraday-2.5.2/spec/spec_helper.rb +132 -0
  76. data/vendor/gems/faraday-2.5.2/spec/support/disabling_stub.rb +14 -0
  77. data/vendor/gems/faraday-2.5.2/spec/support/fake_safe_buffer.rb +15 -0
  78. data/vendor/gems/faraday-2.5.2/spec/support/helper_methods.rb +96 -0
  79. data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/adapter.rb +105 -0
  80. data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/params_encoder.rb +18 -0
  81. data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/request_method.rb +263 -0
  82. data/vendor/gems/faraday-2.5.2/spec/support/streaming_response_checker.rb +35 -0
  83. data/vendor/gems/faraday-net_http-3.0.2/LICENSE.md +21 -0
  84. data/vendor/gems/faraday-net_http-3.0.2/README.md +57 -0
  85. data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/adapter/net_http.rb +208 -0
  86. data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/net_http/version.rb +7 -0
  87. data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/net_http.rb +10 -0
  88. data/vendor/gems/faraday-net_http_persistent-2.3.0/LICENSE.md +21 -0
  89. data/vendor/gems/faraday-net_http_persistent-2.3.0/README.md +66 -0
  90. data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/adapter/net_http_persistent.rb +234 -0
  91. data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/net_http_persistent/version.rb +7 -0
  92. data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/net_http_persistent.rb +18 -0
  93. data/vendor/gems/faraday-retry-2.0.0/CHANGELOG.md +24 -0
  94. data/vendor/gems/faraday-retry-2.0.0/LICENSE.md +21 -0
  95. data/vendor/gems/faraday-retry-2.0.0/README.md +169 -0
  96. data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retriable_response.rb +8 -0
  97. data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry/middleware.rb +254 -0
  98. data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry/version.rb +7 -0
  99. data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry.rb +13 -0
  100. data/vendor/gems/net-http-persistent-4.0.5/.autotest +9 -0
  101. data/vendor/gems/net-http-persistent-4.0.5/.gemtest +0 -0
  102. data/vendor/gems/net-http-persistent-4.0.5/Gemfile +14 -0
  103. data/vendor/gems/net-http-persistent-4.0.5/History.txt +460 -0
  104. data/vendor/gems/net-http-persistent-4.0.5/Manifest.txt +13 -0
  105. data/vendor/gems/net-http-persistent-4.0.5/README.rdoc +82 -0
  106. data/vendor/gems/net-http-persistent-4.0.5/Rakefile +25 -0
  107. data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/connection.rb +41 -0
  108. data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/pool.rb +65 -0
  109. data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  110. data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent.rb +1158 -0
  111. data/vendor/gems/net-http-persistent-4.0.5/test/test_net_http_persistent.rb +1512 -0
  112. data/vendor/gems/net-http-persistent-4.0.5/test/test_net_http_persistent_timed_stack_multi.rb +151 -0
  113. 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