faraday 0.9.1 → 1.8.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 +5 -5
- data/CHANGELOG.md +360 -0
- data/LICENSE.md +1 -1
- data/README.md +28 -195
- data/Rakefile +4 -68
- data/examples/client_spec.rb +97 -0
- data/examples/client_test.rb +118 -0
- data/lib/faraday/adapter/test.rb +158 -58
- data/lib/faraday/adapter/typhoeus.rb +7 -115
- data/lib/faraday/adapter.rb +79 -20
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/autoload.rb +39 -36
- data/lib/faraday/connection.rb +378 -168
- data/lib/faraday/dependency_loader.rb +37 -0
- 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 +128 -29
- data/lib/faraday/file_part.rb +128 -0
- data/lib/faraday/logging/formatter.rb +105 -0
- data/lib/faraday/methods.rb +6 -0
- data/lib/faraday/middleware.rb +19 -25
- data/lib/faraday/middleware_registry.rb +129 -0
- data/lib/faraday/options/connection_options.rb +22 -0
- data/lib/faraday/options/env.rb +181 -0
- data/lib/faraday/options/proxy_options.rb +32 -0
- data/lib/faraday/options/request_options.rb +22 -0
- data/lib/faraday/options/ssl_options.rb +59 -0
- data/lib/faraday/options.rb +61 -193
- data/lib/faraday/param_part.rb +53 -0
- data/lib/faraday/parameters.rb +4 -180
- data/lib/faraday/rack_builder.rb +84 -47
- data/lib/faraday/request/authorization.rb +51 -31
- data/lib/faraday/request/basic_authentication.rb +14 -7
- data/lib/faraday/request/instrumentation.rb +45 -27
- data/lib/faraday/request/multipart.rb +88 -45
- data/lib/faraday/request/retry.rb +212 -121
- data/lib/faraday/request/token_authentication.rb +15 -10
- data/lib/faraday/request/url_encoded.rb +43 -23
- data/lib/faraday/request.rb +96 -32
- data/lib/faraday/response/logger.rb +22 -48
- data/lib/faraday/response/raise_error.rb +49 -14
- data/lib/faraday/response.rb +33 -25
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +38 -218
- data/lib/faraday/version.rb +5 -0
- data/lib/faraday.rb +130 -213
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/spec/faraday/adapter/em_http_spec.rb +49 -0
- data/spec/faraday/adapter/em_synchrony_spec.rb +18 -0
- data/spec/faraday/adapter/excon_spec.rb +49 -0
- data/spec/faraday/adapter/httpclient_spec.rb +73 -0
- data/spec/faraday/adapter/net_http_spec.rb +64 -0
- data/spec/faraday/adapter/patron_spec.rb +18 -0
- data/spec/faraday/adapter/rack_spec.rb +8 -0
- data/spec/faraday/adapter/test_spec.rb +377 -0
- data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
- data/spec/faraday/adapter_registry_spec.rb +28 -0
- data/spec/faraday/adapter_spec.rb +55 -0
- data/spec/faraday/composite_read_io_spec.rb +80 -0
- data/spec/faraday/connection_spec.rb +736 -0
- data/spec/faraday/error_spec.rb +60 -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 +345 -0
- data/spec/faraday/request/authorization_spec.rb +96 -0
- data/spec/faraday/request/instrumentation_spec.rb +76 -0
- data/spec/faraday/request/multipart_spec.rb +302 -0
- data/spec/faraday/request/retry_spec.rb +242 -0
- data/spec/faraday/request/url_encoded_spec.rb +83 -0
- data/spec/faraday/request_spec.rb +120 -0
- data/spec/faraday/response/logger_spec.rb +220 -0
- data/spec/faraday/response/middleware_spec.rb +68 -0
- data/spec/faraday/response/raise_error_spec.rb +169 -0
- data/spec/faraday/response_spec.rb +75 -0
- data/spec/faraday/utils/headers_spec.rb +82 -0
- data/spec/faraday/utils_spec.rb +56 -0
- data/spec/faraday_spec.rb +37 -0
- data/spec/spec_helper.rb +132 -0
- data/spec/support/disabling_stub.rb +14 -0
- data/spec/support/fake_safe_buffer.rb +15 -0
- data/spec/support/helper_methods.rb +133 -0
- data/spec/support/shared_examples/adapter.rb +105 -0
- data/spec/support/shared_examples/params_encoder.rb +18 -0
- data/spec/support/shared_examples/request_method.rb +262 -0
- data/spec/support/streaming_response_checker.rb +35 -0
- data/spec/support/webmock_rack_app.rb +68 -0
- metadata +199 -98
- data/.document +0 -6
- data/CONTRIBUTING.md +0 -36
- data/Gemfile +0 -25
- data/faraday.gemspec +0 -34
- data/lib/faraday/adapter/em_http.rb +0 -237
- 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 -92
- data/lib/faraday/adapter/excon.rb +0 -80
- data/lib/faraday/adapter/httpclient.rb +0 -106
- data/lib/faraday/adapter/net_http.rb +0 -130
- data/lib/faraday/adapter/net_http_persistent.rb +0 -48
- data/lib/faraday/adapter/patron.rb +0 -72
- data/lib/faraday/adapter/rack.rb +0 -58
- data/lib/faraday/upload_io.rb +0 -67
- data/script/cached-bundle +0 -46
- data/script/console +0 -7
- data/script/generate_certs +0 -42
- data/script/package +0 -7
- data/script/proxy-server +0 -42
- data/script/release +0 -17
- data/script/s3-put +0 -71
- data/script/server +0 -36
- data/script/test +0 -172
- data/test/adapters/default_test.rb +0 -14
- data/test/adapters/em_http_test.rb +0 -20
- data/test/adapters/em_synchrony_test.rb +0 -20
- data/test/adapters/excon_test.rb +0 -20
- data/test/adapters/httpclient_test.rb +0 -21
- data/test/adapters/integration.rb +0 -254
- data/test/adapters/logger_test.rb +0 -82
- data/test/adapters/net_http_persistent_test.rb +0 -20
- data/test/adapters/net_http_test.rb +0 -14
- data/test/adapters/patron_test.rb +0 -20
- data/test/adapters/rack_test.rb +0 -31
- data/test/adapters/test_middleware_test.rb +0 -114
- data/test/adapters/typhoeus_test.rb +0 -28
- data/test/authentication_middleware_test.rb +0 -65
- data/test/composite_read_io_test.rb +0 -111
- data/test/connection_test.rb +0 -522
- data/test/env_test.rb +0 -218
- data/test/helper.rb +0 -81
- data/test/live_server.rb +0 -67
- data/test/middleware/instrumentation_test.rb +0 -88
- data/test/middleware/retry_test.rb +0 -177
- data/test/middleware_stack_test.rb +0 -173
- data/test/multibyte.txt +0 -1
- data/test/options_test.rb +0 -252
- data/test/parameters_test.rb +0 -64
- data/test/request_middleware_test.rb +0 -142
- data/test/response_middleware_test.rb +0 -72
- data/test/strawberry.rb +0 -2
- data/test/utils_test.rb +0 -58
data/lib/faraday/options.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Faraday
|
2
4
|
# Subclasses Struct with some special helpers for converting from a Hash to
|
3
5
|
# a Struct.
|
@@ -10,6 +12,7 @@ module Faraday
|
|
10
12
|
# Public
|
11
13
|
def each
|
12
14
|
return to_enum(:each) unless block_given?
|
15
|
+
|
13
16
|
members.each do |key|
|
14
17
|
yield(key.to_sym, send(key))
|
15
18
|
end
|
@@ -18,23 +21,20 @@ module Faraday
|
|
18
21
|
# Public
|
19
22
|
def update(obj)
|
20
23
|
obj.each do |key, value|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
value.
|
26
|
-
|
27
|
-
|
28
|
-
value = hash
|
24
|
+
sub_options = self.class.options_for(key)
|
25
|
+
if sub_options
|
26
|
+
new_value = sub_options.from(value) if value
|
27
|
+
elsif value.is_a?(Hash)
|
28
|
+
new_value = value.dup
|
29
|
+
else
|
30
|
+
new_value = value
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
send("#{key}=", new_value) unless new_value.nil?
|
32
34
|
end
|
33
35
|
self
|
34
36
|
end
|
35
37
|
|
36
|
-
alias merge! update
|
37
|
-
|
38
38
|
# Public
|
39
39
|
def delete(key)
|
40
40
|
value = send(key)
|
@@ -48,18 +48,38 @@ module Faraday
|
|
48
48
|
end
|
49
49
|
|
50
50
|
# Public
|
51
|
-
def merge(
|
52
|
-
|
51
|
+
def merge!(other)
|
52
|
+
other.each do |key, other_value|
|
53
|
+
self_value = send(key)
|
54
|
+
sub_options = self.class.options_for(key)
|
55
|
+
new_value = if self_value && sub_options && other_value
|
56
|
+
self_value.merge(other_value)
|
57
|
+
else
|
58
|
+
other_value
|
59
|
+
end
|
60
|
+
send("#{key}=", new_value) unless new_value.nil?
|
61
|
+
end
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
# Public
|
66
|
+
def merge(other)
|
67
|
+
dup.merge!(other)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Public
|
71
|
+
def deep_dup
|
72
|
+
self.class.from(self)
|
53
73
|
end
|
54
74
|
|
55
75
|
# Public
|
56
76
|
def fetch(key, *args)
|
57
77
|
unless symbolized_key_set.include?(key.to_sym)
|
58
78
|
key_setter = "#{key}="
|
59
|
-
if args.
|
79
|
+
if !args.empty?
|
60
80
|
send(key_setter, args.first)
|
61
81
|
elsif block_given?
|
62
|
-
send(key_setter,
|
82
|
+
send(key_setter, yield(key))
|
63
83
|
else
|
64
84
|
raise self.class.fetch_error_class, "key not found: #{key.inspect}"
|
65
85
|
end
|
@@ -83,11 +103,10 @@ module Faraday
|
|
83
103
|
end
|
84
104
|
|
85
105
|
# Public
|
86
|
-
def each_key
|
106
|
+
def each_key(&block)
|
87
107
|
return to_enum(:each_key) unless block_given?
|
88
|
-
|
89
|
-
|
90
|
-
end
|
108
|
+
|
109
|
+
keys.each(&block)
|
91
110
|
end
|
92
111
|
|
93
112
|
# Public
|
@@ -98,11 +117,10 @@ module Faraday
|
|
98
117
|
alias has_key? key?
|
99
118
|
|
100
119
|
# Public
|
101
|
-
def each_value
|
120
|
+
def each_value(&block)
|
102
121
|
return to_enum(:each_value) unless block_given?
|
103
|
-
|
104
|
-
|
105
|
-
end
|
122
|
+
|
123
|
+
values.each(&block)
|
106
124
|
end
|
107
125
|
|
108
126
|
# Public
|
@@ -129,9 +147,9 @@ module Faraday
|
|
129
147
|
value = send(member)
|
130
148
|
values << "#{member}=#{value.inspect}" if value
|
131
149
|
end
|
132
|
-
values = values.empty? ? '
|
150
|
+
values = values.empty? ? '(empty)' : values.join(', ')
|
133
151
|
|
134
|
-
%(#<#{self.class}#{values}>)
|
152
|
+
%(#<#{self.class} #{values}>)
|
135
153
|
end
|
136
154
|
|
137
155
|
# Internal
|
@@ -149,8 +167,12 @@ module Faraday
|
|
149
167
|
@attribute_options ||= {}
|
150
168
|
end
|
151
169
|
|
152
|
-
def self.memoized(key)
|
153
|
-
|
170
|
+
def self.memoized(key, &block)
|
171
|
+
unless block_given?
|
172
|
+
raise ArgumentError, '#memoized must be called with a block'
|
173
|
+
end
|
174
|
+
|
175
|
+
memoized_attributes[key.to_sym] = block
|
154
176
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
155
177
|
def #{key}() self[:#{key}]; end
|
156
178
|
RUBY
|
@@ -162,7 +184,7 @@ module Faraday
|
|
162
184
|
|
163
185
|
def [](key)
|
164
186
|
key = key.to_sym
|
165
|
-
if method = self.class.memoized_attributes[key]
|
187
|
+
if (method = self.class.memoized_attributes[key])
|
166
188
|
super(key) || (self[key] = instance_eval(&method))
|
167
189
|
else
|
168
190
|
super
|
@@ -170,7 +192,7 @@ module Faraday
|
|
170
192
|
end
|
171
193
|
|
172
194
|
def symbolized_key_set
|
173
|
-
@symbolized_key_set ||= Set.new(keys.map
|
195
|
+
@symbolized_key_set ||= Set.new(keys.map(&:to_sym))
|
174
196
|
end
|
175
197
|
|
176
198
|
def self.inherited(subclass)
|
@@ -181,170 +203,16 @@ module Faraday
|
|
181
203
|
|
182
204
|
def self.fetch_error_class
|
183
205
|
@fetch_error_class ||= if Object.const_defined?(:KeyError)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
class RequestOptions < Options.new(:params_encoder, :proxy, :bind,
|
192
|
-
:timeout, :open_timeout, :boundary,
|
193
|
-
:oauth)
|
194
|
-
|
195
|
-
def []=(key, value)
|
196
|
-
if key && key.to_sym == :proxy
|
197
|
-
super(key, value ? ProxyOptions.from(value) : nil)
|
198
|
-
else
|
199
|
-
super(key, value)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode,
|
205
|
-
:cert_store, :client_cert, :client_key, :certificate, :private_key, :verify_depth, :version)
|
206
|
-
|
207
|
-
def verify?
|
208
|
-
verify != false
|
209
|
-
end
|
210
|
-
|
211
|
-
def disable?
|
212
|
-
!verify?
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
class ProxyOptions < Options.new(:uri, :user, :password)
|
217
|
-
extend Forwardable
|
218
|
-
def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=, :path, :path=
|
219
|
-
|
220
|
-
def self.from(value)
|
221
|
-
case value
|
222
|
-
when String
|
223
|
-
value = {:uri => Utils.URI(value)}
|
224
|
-
when URI
|
225
|
-
value = {:uri => value}
|
226
|
-
when Hash, Options
|
227
|
-
if uri = value.delete(:uri)
|
228
|
-
value[:uri] = Utils.URI(uri)
|
229
|
-
end
|
230
|
-
end
|
231
|
-
super(value)
|
232
|
-
end
|
233
|
-
|
234
|
-
memoized(:user) { uri.user && Utils.unescape(uri.user) }
|
235
|
-
memoized(:password) { uri.password && Utils.unescape(uri.password) }
|
236
|
-
end
|
237
|
-
|
238
|
-
class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url,
|
239
|
-
:parallel_manager, :params, :headers, :builder_class)
|
240
|
-
|
241
|
-
options :request => RequestOptions, :ssl => SSLOptions
|
242
|
-
|
243
|
-
memoized(:request) { self.class.options_for(:request).new }
|
244
|
-
|
245
|
-
memoized(:ssl) { self.class.options_for(:ssl).new }
|
246
|
-
|
247
|
-
memoized(:builder_class) { RackBuilder }
|
248
|
-
|
249
|
-
def new_builder(block)
|
250
|
-
builder_class.new(&block)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
class Env < Options.new(:method, :body, :url, :request, :request_headers,
|
255
|
-
:ssl, :parallel_manager, :params, :response, :response_headers, :status)
|
256
|
-
|
257
|
-
ContentLength = 'Content-Length'.freeze
|
258
|
-
StatusesWithoutBody = Set.new [204, 304]
|
259
|
-
SuccessfulStatuses = 200..299
|
260
|
-
|
261
|
-
# A Set of HTTP verbs that typically send a body. If no body is set for
|
262
|
-
# these requests, the Content-Length header is set to 0.
|
263
|
-
MethodsWithBodies = Set.new [:post, :put, :patch, :options]
|
264
|
-
|
265
|
-
options :request => RequestOptions,
|
266
|
-
:request_headers => Utils::Headers, :response_headers => Utils::Headers
|
267
|
-
|
268
|
-
extend Forwardable
|
269
|
-
|
270
|
-
def_delegators :request, :params_encoder
|
271
|
-
|
272
|
-
# Public
|
273
|
-
def [](key)
|
274
|
-
if in_member_set?(key)
|
275
|
-
super(key)
|
276
|
-
else
|
277
|
-
custom_members[key]
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
# Public
|
282
|
-
def []=(key, value)
|
283
|
-
if in_member_set?(key)
|
284
|
-
super(key, value)
|
285
|
-
else
|
286
|
-
custom_members[key] = value
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
# Public
|
291
|
-
def success?
|
292
|
-
SuccessfulStatuses.include?(status)
|
293
|
-
end
|
294
|
-
|
295
|
-
# Public
|
296
|
-
def needs_body?
|
297
|
-
!body && MethodsWithBodies.include?(method)
|
298
|
-
end
|
299
|
-
|
300
|
-
# Public
|
301
|
-
def clear_body
|
302
|
-
request_headers[ContentLength] = '0'
|
303
|
-
self.body = ''
|
304
|
-
end
|
305
|
-
|
306
|
-
# Public
|
307
|
-
def parse_body?
|
308
|
-
!StatusesWithoutBody.include?(status)
|
309
|
-
end
|
310
|
-
|
311
|
-
# Public
|
312
|
-
def parallel?
|
313
|
-
!!parallel_manager
|
314
|
-
end
|
315
|
-
|
316
|
-
def inspect
|
317
|
-
attrs = [nil]
|
318
|
-
members.each do |mem|
|
319
|
-
if value = send(mem)
|
320
|
-
attrs << "@#{mem}=#{value.inspect}"
|
321
|
-
end
|
322
|
-
end
|
323
|
-
if !custom_members.empty?
|
324
|
-
attrs << "@custom=#{custom_members.inspect}"
|
325
|
-
end
|
326
|
-
%(#<#{self.class}#{attrs.join(" ")}>)
|
327
|
-
end
|
328
|
-
|
329
|
-
# Internal
|
330
|
-
def custom_members
|
331
|
-
@custom_members ||= {}
|
332
|
-
end
|
333
|
-
|
334
|
-
# Internal
|
335
|
-
if members.first.is_a?(Symbol)
|
336
|
-
def in_member_set?(key)
|
337
|
-
self.class.member_set.include?(key.to_sym)
|
338
|
-
end
|
339
|
-
else
|
340
|
-
def in_member_set?(key)
|
341
|
-
self.class.member_set.include?(key.to_s)
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
|
-
# Internal
|
346
|
-
def self.member_set
|
347
|
-
@member_set ||= Set.new(members)
|
206
|
+
::KeyError
|
207
|
+
else
|
208
|
+
::IndexError
|
209
|
+
end
|
348
210
|
end
|
349
211
|
end
|
350
212
|
end
|
213
|
+
|
214
|
+
require 'faraday/options/request_options'
|
215
|
+
require 'faraday/options/ssl_options'
|
216
|
+
require 'faraday/options/proxy_options'
|
217
|
+
require 'faraday/options/connection_options'
|
218
|
+
require 'faraday/options/env'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# Multipart value used to POST data with a content type.
|
5
|
+
class ParamPart
|
6
|
+
# @param value [String] Uploaded content as a String.
|
7
|
+
# @param content_type [String] String content type of the value.
|
8
|
+
# @param content_id [String] Optional String of this value's Content-ID.
|
9
|
+
#
|
10
|
+
# @return [Faraday::ParamPart]
|
11
|
+
def initialize(value, content_type, content_id = nil)
|
12
|
+
@value = value
|
13
|
+
@content_type = content_type
|
14
|
+
@content_id = content_id
|
15
|
+
end
|
16
|
+
|
17
|
+
# Converts this value to a form part.
|
18
|
+
#
|
19
|
+
# @param boundary [String] String multipart boundary that must not exist in
|
20
|
+
# the content exactly.
|
21
|
+
# @param key [String] String key name for this value.
|
22
|
+
#
|
23
|
+
# @return [Faraday::Parts::Part]
|
24
|
+
def to_part(boundary, key)
|
25
|
+
Faraday::Parts::Part.new(boundary, key, value, headers)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns a Hash of String key/value pairs.
|
29
|
+
#
|
30
|
+
# @return [Hash]
|
31
|
+
def headers
|
32
|
+
{
|
33
|
+
'Content-Type' => content_type,
|
34
|
+
'Content-ID' => content_id
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
# The content to upload.
|
39
|
+
#
|
40
|
+
# @return [String]
|
41
|
+
attr_reader :value
|
42
|
+
|
43
|
+
# The value's content type.
|
44
|
+
#
|
45
|
+
# @return [String]
|
46
|
+
attr_reader :content_type
|
47
|
+
|
48
|
+
# The value's content ID, if given.
|
49
|
+
#
|
50
|
+
# @return [String, nil]
|
51
|
+
attr_reader :content_id
|
52
|
+
end
|
53
|
+
end
|
data/lib/faraday/parameters.rb
CHANGED
@@ -1,181 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
extend Forwardable
|
7
|
-
def_delegators :'Faraday::Utils', :escape, :unescape
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.encode(params)
|
11
|
-
return nil if params == nil
|
12
|
-
|
13
|
-
if !params.is_a?(Array)
|
14
|
-
if !params.respond_to?(:to_hash)
|
15
|
-
raise TypeError,
|
16
|
-
"Can't convert #{params.class} into Hash."
|
17
|
-
end
|
18
|
-
params = params.to_hash
|
19
|
-
params = params.map do |key, value|
|
20
|
-
key = key.to_s if key.kind_of?(Symbol)
|
21
|
-
[key, value]
|
22
|
-
end
|
23
|
-
# Useful default for OAuth and caching.
|
24
|
-
# Only to be used for non-Array inputs. Arrays should preserve order.
|
25
|
-
params.sort!
|
26
|
-
end
|
27
|
-
|
28
|
-
# Helper lambda
|
29
|
-
to_query = lambda do |parent, value|
|
30
|
-
if value.is_a?(Hash)
|
31
|
-
value = value.map do |key, val|
|
32
|
-
key = escape(key)
|
33
|
-
[key, val]
|
34
|
-
end
|
35
|
-
value.sort!
|
36
|
-
buffer = ""
|
37
|
-
value.each do |key, val|
|
38
|
-
new_parent = "#{parent}%5B#{key}%5D"
|
39
|
-
buffer << "#{to_query.call(new_parent, val)}&"
|
40
|
-
end
|
41
|
-
return buffer.chop
|
42
|
-
elsif value.is_a?(Array)
|
43
|
-
buffer = ""
|
44
|
-
value.each_with_index do |val, i|
|
45
|
-
new_parent = "#{parent}%5B%5D"
|
46
|
-
buffer << "#{to_query.call(new_parent, val)}&"
|
47
|
-
end
|
48
|
-
return buffer.chop
|
49
|
-
else
|
50
|
-
encoded_value = escape(value)
|
51
|
-
return "#{parent}=#{encoded_value}"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# The params have form [['key1', 'value1'], ['key2', 'value2']].
|
56
|
-
buffer = ''
|
57
|
-
params.each do |parent, value|
|
58
|
-
encoded_parent = escape(parent)
|
59
|
-
buffer << "#{to_query.call(encoded_parent, value)}&"
|
60
|
-
end
|
61
|
-
return buffer.chop
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.decode(query)
|
65
|
-
return nil if query == nil
|
66
|
-
# Recursive helper lambda
|
67
|
-
dehash = lambda do |hash|
|
68
|
-
hash.each do |(key, value)|
|
69
|
-
if value.kind_of?(Hash)
|
70
|
-
hash[key] = dehash.call(value)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
# Numeric keys implies an array
|
74
|
-
if hash != {} && hash.keys.all? { |key| key =~ /^\d+$/ }
|
75
|
-
hash.sort.inject([]) do |accu, (_, value)|
|
76
|
-
accu << value; accu
|
77
|
-
end
|
78
|
-
else
|
79
|
-
hash
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
empty_accumulator = {}
|
84
|
-
return ((query.split('&').map do |pair|
|
85
|
-
pair.split('=', 2) if pair && !pair.empty?
|
86
|
-
end).compact.inject(empty_accumulator.dup) do |accu, (key, value)|
|
87
|
-
key = unescape(key)
|
88
|
-
if value.kind_of?(String)
|
89
|
-
value = unescape(value.gsub(/\+/, ' '))
|
90
|
-
end
|
91
|
-
|
92
|
-
array_notation = !!(key =~ /\[\]$/)
|
93
|
-
subkeys = key.split(/[\[\]]+/)
|
94
|
-
current_hash = accu
|
95
|
-
for i in 0...(subkeys.size - 1)
|
96
|
-
subkey = subkeys[i]
|
97
|
-
current_hash[subkey] = {} unless current_hash[subkey]
|
98
|
-
current_hash = current_hash[subkey]
|
99
|
-
end
|
100
|
-
if array_notation
|
101
|
-
current_hash[subkeys.last] = [] unless current_hash[subkeys.last]
|
102
|
-
current_hash[subkeys.last] << value
|
103
|
-
else
|
104
|
-
current_hash[subkeys.last] = value
|
105
|
-
end
|
106
|
-
accu
|
107
|
-
end).inject(empty_accumulator.dup) do |accu, (key, value)|
|
108
|
-
accu[key] = value.kind_of?(Hash) ? dehash.call(value) : value
|
109
|
-
accu
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
module FlatParamsEncoder
|
115
|
-
class << self
|
116
|
-
extend Forwardable
|
117
|
-
def_delegators :'Faraday::Utils', :escape, :unescape
|
118
|
-
end
|
119
|
-
|
120
|
-
def self.encode(params)
|
121
|
-
return nil if params == nil
|
122
|
-
|
123
|
-
if !params.is_a?(Array)
|
124
|
-
if !params.respond_to?(:to_hash)
|
125
|
-
raise TypeError,
|
126
|
-
"Can't convert #{params.class} into Hash."
|
127
|
-
end
|
128
|
-
params = params.to_hash
|
129
|
-
params = params.map do |key, value|
|
130
|
-
key = key.to_s if key.kind_of?(Symbol)
|
131
|
-
[key, value]
|
132
|
-
end
|
133
|
-
# Useful default for OAuth and caching.
|
134
|
-
# Only to be used for non-Array inputs. Arrays should preserve order.
|
135
|
-
params.sort!
|
136
|
-
end
|
137
|
-
|
138
|
-
# The params have form [['key1', 'value1'], ['key2', 'value2']].
|
139
|
-
buffer = ''
|
140
|
-
params.each do |key, value|
|
141
|
-
encoded_key = escape(key)
|
142
|
-
value = value.to_s if value == true || value == false
|
143
|
-
if value == nil
|
144
|
-
buffer << "#{encoded_key}&"
|
145
|
-
elsif value.kind_of?(Array)
|
146
|
-
value.each do |sub_value|
|
147
|
-
encoded_value = escape(sub_value)
|
148
|
-
buffer << "#{encoded_key}=#{encoded_value}&"
|
149
|
-
end
|
150
|
-
else
|
151
|
-
encoded_value = escape(value)
|
152
|
-
buffer << "#{encoded_key}=#{encoded_value}&"
|
153
|
-
end
|
154
|
-
end
|
155
|
-
return buffer.chop
|
156
|
-
end
|
157
|
-
|
158
|
-
def self.decode(query)
|
159
|
-
empty_accumulator = {}
|
160
|
-
return nil if query == nil
|
161
|
-
split_query = (query.split('&').map do |pair|
|
162
|
-
pair.split('=', 2) if pair && !pair.empty?
|
163
|
-
end).compact
|
164
|
-
return split_query.inject(empty_accumulator.dup) do |accu, pair|
|
165
|
-
pair[0] = unescape(pair[0])
|
166
|
-
pair[1] = true if pair[1].nil?
|
167
|
-
if pair[1].respond_to?(:to_str)
|
168
|
-
pair[1] = unescape(pair[1].to_str.gsub(/\+/, " "))
|
169
|
-
end
|
170
|
-
if accu[pair[0]].kind_of?(Array)
|
171
|
-
accu[pair[0]] << pair[1]
|
172
|
-
elsif accu[pair[0]]
|
173
|
-
accu[pair[0]] = [accu[pair[0]], pair[1]]
|
174
|
-
else
|
175
|
-
accu[pair[0]] = pair[1]
|
176
|
-
end
|
177
|
-
accu
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
3
|
+
require 'forwardable'
|
4
|
+
require 'faraday/encoders/nested_params_encoder'
|
5
|
+
require 'faraday/encoders/flat_params_encoder'
|