faraday 0.16.0 → 0.17.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/LICENSE.md +1 -1
- data/README.md +347 -18
- data/lib/faraday/adapter/em_http.rb +99 -142
- data/lib/faraday/adapter/em_http_ssl_patch.rb +17 -23
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +15 -18
- data/lib/faraday/adapter/em_synchrony.rb +60 -104
- data/lib/faraday/adapter/excon.rb +55 -100
- data/lib/faraday/adapter/httpclient.rb +39 -61
- data/lib/faraday/adapter/net_http.rb +51 -104
- data/lib/faraday/adapter/net_http_persistent.rb +27 -48
- data/lib/faraday/adapter/patron.rb +35 -54
- data/lib/faraday/adapter/rack.rb +12 -28
- data/lib/faraday/adapter/test.rb +53 -86
- data/lib/faraday/adapter/typhoeus.rb +1 -4
- data/lib/faraday/adapter.rb +22 -36
- data/lib/faraday/autoload.rb +36 -47
- data/lib/faraday/connection.rb +179 -321
- data/lib/faraday/error.rb +33 -67
- data/lib/faraday/middleware.rb +28 -4
- data/lib/faraday/options.rb +186 -35
- data/lib/faraday/parameters.rb +197 -4
- data/lib/faraday/rack_builder.rb +56 -67
- data/lib/faraday/request/authorization.rb +30 -42
- data/lib/faraday/request/basic_authentication.rb +7 -14
- data/lib/faraday/request/instrumentation.rb +27 -45
- data/lib/faraday/request/multipart.rb +48 -79
- data/lib/faraday/request/retry.rb +170 -197
- data/lib/faraday/request/token_authentication.rb +10 -15
- data/lib/faraday/request/url_encoded.rb +23 -41
- data/lib/faraday/request.rb +36 -68
- data/lib/faraday/response/logger.rb +69 -22
- data/lib/faraday/response/raise_error.rb +14 -36
- data/lib/faraday/response.rb +16 -23
- data/lib/faraday/upload_io.rb +67 -0
- data/lib/faraday/utils.rb +245 -28
- data/lib/faraday.rb +175 -93
- metadata +5 -22
- data/lib/faraday/adapter_registry.rb +0 -28
- data/lib/faraday/dependency_loader.rb +0 -37
- data/lib/faraday/encoders/flat_params_encoder.rb +0 -94
- data/lib/faraday/encoders/nested_params_encoder.rb +0 -171
- data/lib/faraday/file_part.rb +0 -128
- data/lib/faraday/logging/formatter.rb +0 -92
- data/lib/faraday/middleware_registry.rb +0 -129
- data/lib/faraday/options/connection_options.rb +0 -22
- data/lib/faraday/options/env.rb +0 -181
- data/lib/faraday/options/proxy_options.rb +0 -28
- data/lib/faraday/options/request_options.rb +0 -21
- data/lib/faraday/options/ssl_options.rb +0 -59
- data/lib/faraday/param_part.rb +0 -53
- data/lib/faraday/utils/headers.rb +0 -139
- data/lib/faraday/utils/params_hash.rb +0 -61
- data/spec/external_adapters/faraday_specs_setup.rb +0 -14
data/lib/faraday/rack_builder.rb
CHANGED
@@ -1,20 +1,12 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'faraday/adapter_registry'
|
4
|
-
|
5
1
|
module Faraday
|
6
2
|
# A Builder that processes requests into responses by passing through an inner
|
7
3
|
# middleware stack (heavily inspired by Rack).
|
8
4
|
#
|
9
|
-
#
|
10
|
-
# Faraday::Connection.new(url: 'http://sushi.com') do |builder|
|
5
|
+
# Faraday::Connection.new(:url => 'http://sushi.com') do |builder|
|
11
6
|
# builder.request :url_encoded # Faraday::Request::UrlEncoded
|
12
7
|
# builder.adapter :net_http # Faraday::Adapter::NetHttp
|
13
8
|
# end
|
14
9
|
class RackBuilder
|
15
|
-
# Used to detect missing arguments
|
16
|
-
NO_ARGUMENT = Object.new
|
17
|
-
|
18
10
|
attr_accessor :handlers
|
19
11
|
|
20
12
|
# Error raised when trying to modify the stack after calling `lock!`
|
@@ -23,28 +15,28 @@ module Faraday
|
|
23
15
|
# borrowed from ActiveSupport::Dependencies::Reference &
|
24
16
|
# ActionDispatch::MiddlewareStack::Middleware
|
25
17
|
class Handler
|
26
|
-
|
18
|
+
@@constants_mutex = Mutex.new
|
19
|
+
@@constants = Hash.new { |h, k|
|
20
|
+
value = k.respond_to?(:constantize) ? k.constantize : Object.const_get(k)
|
21
|
+
@@constants_mutex.synchronize { h[k] = value }
|
22
|
+
}
|
27
23
|
|
28
24
|
attr_reader :name
|
29
25
|
|
30
26
|
def initialize(klass, *args, &block)
|
31
27
|
@name = klass.to_s
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
def klass
|
38
|
-
REGISTRY.get(@name)
|
28
|
+
if klass.respond_to?(:name)
|
29
|
+
@@constants_mutex.synchronize { @@constants[@name] = klass }
|
30
|
+
end
|
31
|
+
@args, @block = args, block
|
39
32
|
end
|
40
33
|
|
41
|
-
def
|
42
|
-
|
43
|
-
end
|
34
|
+
def klass() @@constants[@name] end
|
35
|
+
def inspect() @name end
|
44
36
|
|
45
37
|
def ==(other)
|
46
38
|
if other.is_a? Handler
|
47
|
-
name == other.name
|
39
|
+
self.name == other.name
|
48
40
|
elsif other.respond_to? :name
|
49
41
|
klass == other
|
50
42
|
else
|
@@ -52,19 +44,18 @@ module Faraday
|
|
52
44
|
end
|
53
45
|
end
|
54
46
|
|
55
|
-
def build(app
|
47
|
+
def build(app)
|
56
48
|
klass.new(app, *@args, &@block)
|
57
49
|
end
|
58
50
|
end
|
59
51
|
|
60
|
-
def initialize(handlers = []
|
61
|
-
@adapter = adapter
|
52
|
+
def initialize(handlers = [])
|
62
53
|
@handlers = handlers
|
63
54
|
if block_given?
|
64
|
-
build(&
|
55
|
+
build(&Proc.new)
|
65
56
|
elsif @handlers.empty?
|
66
57
|
# default stack, if nothing else is configured
|
67
|
-
request :url_encoded
|
58
|
+
self.request :url_encoded
|
68
59
|
self.adapter Faraday.default_adapter
|
69
60
|
end
|
70
61
|
end
|
@@ -73,14 +64,13 @@ module Faraday
|
|
73
64
|
raise_if_locked
|
74
65
|
@handlers.clear unless options[:keep]
|
75
66
|
yield(self) if block_given?
|
76
|
-
adapter(Faraday.default_adapter) unless @adapter
|
77
67
|
end
|
78
68
|
|
79
69
|
def [](idx)
|
80
70
|
@handlers[idx]
|
81
71
|
end
|
82
72
|
|
83
|
-
# Locks the middleware stack to ensure no further modifications are
|
73
|
+
# Locks the middleware stack to ensure no further modifications are possible.
|
84
74
|
def lock!
|
85
75
|
@handlers.freeze
|
86
76
|
end
|
@@ -94,7 +84,7 @@ module Faraday
|
|
94
84
|
use_symbol(Faraday::Middleware, klass, *args, &block)
|
95
85
|
else
|
96
86
|
raise_if_locked
|
97
|
-
|
87
|
+
warn_middleware_after_adapter if adapter_set?
|
98
88
|
@handlers << self.class::Handler.new(klass, *args, &block)
|
99
89
|
end
|
100
90
|
end
|
@@ -107,11 +97,8 @@ module Faraday
|
|
107
97
|
use_symbol(Faraday::Response, key, *args, &block)
|
108
98
|
end
|
109
99
|
|
110
|
-
def adapter(
|
111
|
-
|
112
|
-
|
113
|
-
klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
|
114
|
-
@adapter = self.class::Handler.new(klass, *args, &block)
|
100
|
+
def adapter(key, *args, &block)
|
101
|
+
use_symbol(Faraday::Adapter, key, *args, &block)
|
115
102
|
end
|
116
103
|
|
117
104
|
## methods to push onto the various positions in the stack:
|
@@ -119,11 +106,12 @@ module Faraday
|
|
119
106
|
def insert(index, *args, &block)
|
120
107
|
raise_if_locked
|
121
108
|
index = assert_index(index)
|
109
|
+
warn_middleware_after_adapter if inserting_after_adapter?(index)
|
122
110
|
handler = self.class::Handler.new(*args, &block)
|
123
111
|
@handlers.insert(index, handler)
|
124
112
|
end
|
125
113
|
|
126
|
-
|
114
|
+
alias_method :insert_before, :insert
|
127
115
|
|
128
116
|
def insert_after(index, *args, &block)
|
129
117
|
index = assert_index(index)
|
@@ -145,11 +133,13 @@ module Faraday
|
|
145
133
|
# Processes a Request into a Response by passing it through this Builder's
|
146
134
|
# middleware stack.
|
147
135
|
#
|
148
|
-
#
|
149
|
-
#
|
136
|
+
# connection - Faraday::Connection
|
137
|
+
# request - Faraday::Request
|
150
138
|
#
|
151
|
-
#
|
139
|
+
# Returns a Faraday::Response.
|
152
140
|
def build_response(connection, request)
|
141
|
+
warn 'WARNING: No adapter was configured for this request' unless adapter_set?
|
142
|
+
|
153
143
|
app.call(build_env(connection, request))
|
154
144
|
end
|
155
145
|
|
@@ -163,26 +153,26 @@ module Faraday
|
|
163
153
|
def app
|
164
154
|
@app ||= begin
|
165
155
|
lock!
|
166
|
-
to_app
|
156
|
+
to_app(lambda { |env|
|
157
|
+
response = Response.new
|
158
|
+
env.response = response
|
159
|
+
response.finish(env) unless env.parallel?
|
160
|
+
response
|
161
|
+
})
|
167
162
|
end
|
168
163
|
end
|
169
164
|
|
170
|
-
def to_app
|
165
|
+
def to_app(inner_app)
|
171
166
|
# last added handler is the deepest and thus closest to the inner app
|
172
|
-
|
173
|
-
@handlers.reverse.inject(@adapter.build) do |app, handler|
|
174
|
-
handler.build(app)
|
175
|
-
end
|
167
|
+
@handlers.reverse.inject(inner_app) { |app, handler| handler.build(app) }
|
176
168
|
end
|
177
169
|
|
178
170
|
def ==(other)
|
179
|
-
other.is_a?(self.class) &&
|
180
|
-
@handlers == other.handlers &&
|
181
|
-
@adapter == other.adapter
|
171
|
+
other.is_a?(self.class) && @handlers == other.handlers
|
182
172
|
end
|
183
173
|
|
184
174
|
def dup
|
185
|
-
self.class.new(@handlers.dup
|
175
|
+
self.class.new(@handlers.dup)
|
186
176
|
end
|
187
177
|
|
188
178
|
# ENV Keys
|
@@ -202,36 +192,36 @@ module Faraday
|
|
202
192
|
# :password - Proxy server password
|
203
193
|
# :ssl - Hash of options for configuring SSL requests.
|
204
194
|
def build_env(connection, request)
|
205
|
-
|
206
|
-
request.path, request.params,
|
207
|
-
request.options.
|
208
|
-
|
209
|
-
|
210
|
-
Env.new(request.method, request.body, exclusive_url,
|
211
|
-
request.options, request.headers, connection.ssl,
|
212
|
-
connection.parallel_manager)
|
195
|
+
Env.new(request.method, request.body,
|
196
|
+
connection.build_exclusive_url(request.path, request.params, request.options.params_encoder),
|
197
|
+
request.options, request.headers, connection.ssl,
|
198
|
+
connection.parallel_manager)
|
213
199
|
end
|
214
200
|
|
215
201
|
private
|
216
202
|
|
217
|
-
LOCK_ERR = "can't modify middleware stack after making a request"
|
218
|
-
|
219
203
|
def raise_if_locked
|
220
|
-
raise StackLocked,
|
204
|
+
raise StackLocked, "can't modify middleware stack after making a request" if locked?
|
221
205
|
end
|
222
206
|
|
223
|
-
def
|
224
|
-
|
225
|
-
|
226
|
-
raise 'Adapter should be set using the `adapter` method, not `use`'
|
207
|
+
def warn_middleware_after_adapter
|
208
|
+
warn "WARNING: Unexpected middleware set after the adapter. " \
|
209
|
+
"This won't be supported from Faraday 1.0."
|
227
210
|
end
|
228
211
|
|
229
212
|
def adapter_set?
|
230
|
-
|
213
|
+
@handlers.any? { |handler| is_adapter?(handler) }
|
231
214
|
end
|
232
215
|
|
233
|
-
def
|
234
|
-
|
216
|
+
def inserting_after_adapter?(index)
|
217
|
+
adapter_index = @handlers.find_index { |handler| is_adapter?(handler) }
|
218
|
+
return false if adapter_index.nil?
|
219
|
+
|
220
|
+
index > adapter_index
|
221
|
+
end
|
222
|
+
|
223
|
+
def is_adapter?(handler)
|
224
|
+
handler.klass.ancestors.include? Faraday::Adapter
|
235
225
|
end
|
236
226
|
|
237
227
|
def use_symbol(mod, key, *args, &block)
|
@@ -241,7 +231,6 @@ module Faraday
|
|
241
231
|
def assert_index(index)
|
242
232
|
idx = index.is_a?(Integer) ? index : @handlers.index(index)
|
243
233
|
raise "No such handler: #{index.inspect}" unless idx
|
244
|
-
|
245
234
|
idx
|
246
235
|
end
|
247
236
|
end
|
@@ -1,53 +1,41 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Faraday
|
4
|
-
class Request
|
5
|
-
|
6
|
-
class Authorization < Faraday::Middleware
|
7
|
-
KEY = 'Authorization' unless defined? KEY
|
2
|
+
class Request::Authorization < Faraday::Middleware
|
3
|
+
KEY = "Authorization".freeze unless defined? KEY
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
else
|
19
|
-
raise ArgumentError,
|
20
|
-
"Can't build an Authorization #{type}" \
|
21
|
-
"header from #{token.inspect}"
|
22
|
-
end
|
5
|
+
# Public
|
6
|
+
def self.header(type, token)
|
7
|
+
case token
|
8
|
+
when String, Symbol
|
9
|
+
"#{type} #{token}"
|
10
|
+
when Hash
|
11
|
+
build_hash(type.to_s, token)
|
12
|
+
else
|
13
|
+
raise ArgumentError, "Can't build an Authorization #{type} header from #{token.inspect}"
|
23
14
|
end
|
15
|
+
end
|
24
16
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
values = []
|
32
|
-
hash.each do |key, value|
|
33
|
-
values << "#{key}=#{value.to_s.inspect}"
|
34
|
-
end
|
35
|
-
"#{type} #{values * comma}"
|
17
|
+
# Internal
|
18
|
+
def self.build_hash(type, hash)
|
19
|
+
comma = ", "
|
20
|
+
values = []
|
21
|
+
hash.each do |key, value|
|
22
|
+
values << "#{key}=#{value.to_s.inspect}"
|
36
23
|
end
|
24
|
+
"#{type} #{values * comma}"
|
25
|
+
end
|
37
26
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
@header_value = self.class.header(type, token)
|
43
|
-
super(app)
|
44
|
-
end
|
27
|
+
def initialize(app, type, token)
|
28
|
+
@header_value = self.class.header(type, token)
|
29
|
+
super(app)
|
30
|
+
end
|
45
31
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
@
|
32
|
+
# Public
|
33
|
+
def call(env)
|
34
|
+
unless env.request_headers[KEY]
|
35
|
+
env.request_headers[KEY] = @header_value
|
50
36
|
end
|
37
|
+
@app.call(env)
|
51
38
|
end
|
52
39
|
end
|
53
40
|
end
|
41
|
+
|
@@ -1,20 +1,13 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
require 'base64'
|
4
2
|
|
5
3
|
module Faraday
|
6
|
-
class Request
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# @return [String] a Basic Authentication header line
|
13
|
-
def self.header(login, pass)
|
14
|
-
value = Base64.encode64([login, pass].join(':'))
|
15
|
-
value.delete!("\n")
|
16
|
-
super(:Basic, value)
|
17
|
-
end
|
4
|
+
class Request::BasicAuthentication < Request.load_middleware(:authorization)
|
5
|
+
# Public
|
6
|
+
def self.header(login, pass)
|
7
|
+
value = Base64.encode64([login, pass].join(':'))
|
8
|
+
value.gsub!("\n", '')
|
9
|
+
super(:Basic, value)
|
18
10
|
end
|
19
11
|
end
|
20
12
|
end
|
13
|
+
|
@@ -1,53 +1,35 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Faraday
|
4
|
-
class Request
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class Options < Faraday::Options.new(:name, :instrumenter)
|
9
|
-
# @return [String]
|
10
|
-
def name
|
11
|
-
self[:name] ||= 'request.faraday'
|
12
|
-
end
|
13
|
-
|
14
|
-
# @return [Class]
|
15
|
-
def instrumenter
|
16
|
-
self[:instrumenter] ||= ActiveSupport::Notifications
|
17
|
-
end
|
2
|
+
class Request::Instrumentation < Faraday::Middleware
|
3
|
+
class Options < Faraday::Options.new(:name, :instrumenter)
|
4
|
+
def name
|
5
|
+
self[:name] ||= 'request.faraday'
|
18
6
|
end
|
19
7
|
|
20
|
-
|
21
|
-
|
22
|
-
# Measures time spent only for synchronous requests.
|
23
|
-
#
|
24
|
-
# @example Using ActiveSupport::Notifications to measure time spent
|
25
|
-
# for Faraday requests.
|
26
|
-
# ActiveSupport::Notifications
|
27
|
-
# .subscribe('request.faraday') do |name, starts, ends, _, env|
|
28
|
-
# url = env[:url]
|
29
|
-
# http_method = env[:method].to_s.upcase
|
30
|
-
# duration = ends - starts
|
31
|
-
# $stderr.puts '[%s] %s %s (%.3f s)' %
|
32
|
-
# [url.host, http_method, url.request_uri, duration]
|
33
|
-
# end
|
34
|
-
# @param app [#call]
|
35
|
-
# @param options [nil, Hash] Options hash
|
36
|
-
# @option options [String] :name ('request.faraday')
|
37
|
-
# Name of the instrumenter
|
38
|
-
# @option options [Class] :instrumenter (ActiveSupport::Notifications)
|
39
|
-
# Active Support instrumenter class.
|
40
|
-
def initialize(app, options = nil)
|
41
|
-
super(app)
|
42
|
-
@name, @instrumenter = Options.from(options)
|
43
|
-
.values_at(:name, :instrumenter)
|
8
|
+
def instrumenter
|
9
|
+
self[:instrumenter] ||= ActiveSupport::Notifications
|
44
10
|
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: Instruments requests using Active Support.
|
14
|
+
#
|
15
|
+
# Measures time spent only for synchronous requests.
|
16
|
+
#
|
17
|
+
# Examples
|
18
|
+
#
|
19
|
+
# ActiveSupport::Notifications.subscribe('request.faraday') do |name, starts, ends, _, env|
|
20
|
+
# url = env[:url]
|
21
|
+
# http_method = env[:method].to_s.upcase
|
22
|
+
# duration = ends - starts
|
23
|
+
# $stderr.puts '[%s] %s %s (%.3f s)' % [url.host, http_method, url.request_uri, duration]
|
24
|
+
# end
|
25
|
+
def initialize(app, options = nil)
|
26
|
+
super(app)
|
27
|
+
@name, @instrumenter = Options.from(options).values_at(:name, :instrumenter)
|
28
|
+
end
|
45
29
|
|
46
|
-
|
47
|
-
|
48
|
-
@
|
49
|
-
@app.call(env)
|
50
|
-
end
|
30
|
+
def call(env)
|
31
|
+
@instrumenter.instrument(@name, env) do
|
32
|
+
@app.call(env)
|
51
33
|
end
|
52
34
|
end
|
53
35
|
end
|
@@ -1,97 +1,66 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require File.expand_path('url_encoded', __dir__)
|
1
|
+
require File.expand_path("../url_encoded", __FILE__)
|
4
2
|
require 'securerandom'
|
5
3
|
|
6
4
|
module Faraday
|
7
|
-
class Request
|
8
|
-
|
9
|
-
|
10
|
-
self.mime_type = 'multipart/form-data'
|
11
|
-
unless defined? DEFAULT_BOUNDARY_PREFIX
|
12
|
-
DEFAULT_BOUNDARY_PREFIX = '-----------RubyMultipartPost'
|
13
|
-
end
|
5
|
+
class Request::Multipart < Request::UrlEncoded
|
6
|
+
self.mime_type = 'multipart/form-data'.freeze
|
7
|
+
DEFAULT_BOUNDARY_PREFIX = "-----------RubyMultipartPost".freeze unless defined? DEFAULT_BOUNDARY_PREFIX
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
env.request.boundary ||= unique_boundary
|
21
|
-
env.request_headers[CONTENT_TYPE] +=
|
22
|
-
"; boundary=#{env.request.boundary}"
|
23
|
-
env.body = create_multipart(env, params)
|
24
|
-
end
|
25
|
-
@app.call env
|
9
|
+
def call(env)
|
10
|
+
match_content_type(env) do |params|
|
11
|
+
env.request.boundary ||= unique_boundary
|
12
|
+
env.request_headers[CONTENT_TYPE] += "; boundary=#{env.request.boundary}"
|
13
|
+
env.body = create_multipart(env, params)
|
26
14
|
end
|
15
|
+
@app.call env
|
16
|
+
end
|
27
17
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
18
|
+
def process_request?(env)
|
19
|
+
type = request_type(env)
|
20
|
+
env.body.respond_to?(:each_key) and !env.body.empty? and (
|
21
|
+
(type.empty? and has_multipart?(env.body)) or
|
22
|
+
type == self.class.mime_type
|
23
|
+
)
|
24
|
+
end
|
36
25
|
|
37
|
-
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
if obj.respond_to?(:each)
|
43
|
-
(obj.respond_to?(:values) ? obj.values : obj).each do |val|
|
44
|
-
return true if val.respond_to?(:content_type) || has_multipart?(val)
|
45
|
-
end
|
26
|
+
def has_multipart?(obj)
|
27
|
+
# string is an enum in 1.8, returning list of itself
|
28
|
+
if obj.respond_to?(:each) && !obj.is_a?(String)
|
29
|
+
(obj.respond_to?(:values) ? obj.values : obj).each do |val|
|
30
|
+
return true if (val.respond_to?(:content_type) || has_multipart?(val))
|
46
31
|
end
|
47
|
-
false
|
48
32
|
end
|
33
|
+
false
|
34
|
+
end
|
49
35
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
boundary
|
54
|
-
parts = process_params(params) do |key, value|
|
55
|
-
part(boundary, key, value)
|
56
|
-
end
|
57
|
-
parts << Faraday::Parts::EpiloguePart.new(boundary)
|
58
|
-
|
59
|
-
body = Faraday::CompositeReadIO.new(parts)
|
60
|
-
env.request_headers[Faraday::Env::ContentLength] = body.length.to_s
|
61
|
-
body
|
36
|
+
def create_multipart(env, params)
|
37
|
+
boundary = env.request.boundary
|
38
|
+
parts = process_params(params) do |key, value|
|
39
|
+
Faraday::Parts::Part.new(boundary, key, value)
|
62
40
|
end
|
41
|
+
parts << Faraday::Parts::EpiloguePart.new(boundary)
|
63
42
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
Faraday::Parts::Part.new(boundary, key, value)
|
69
|
-
end
|
70
|
-
end
|
43
|
+
body = Faraday::CompositeReadIO.new(parts)
|
44
|
+
env.request_headers[Faraday::Env::ContentLength] = body.length.to_s
|
45
|
+
return body
|
46
|
+
end
|
71
47
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
48
|
+
def unique_boundary
|
49
|
+
"#{DEFAULT_BOUNDARY_PREFIX}-#{SecureRandom.hex}"
|
50
|
+
end
|
76
51
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
def process_params(params, prefix = nil, pieces = nil, &block)
|
81
|
-
params.inject(pieces || []) do |all, (key, value)|
|
82
|
-
key = "#{prefix}[#{key}]" if prefix
|
52
|
+
def process_params(params, prefix = nil, pieces = nil, &block)
|
53
|
+
params.inject(pieces || []) do |all, (key, value)|
|
54
|
+
key = "#{prefix}[#{key}]" if prefix
|
83
55
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
all << block.call(key, value)
|
93
|
-
# rubocop:enable Performance/RedundantBlockCall
|
94
|
-
end
|
56
|
+
case value
|
57
|
+
when Array
|
58
|
+
values = value.inject([]) { |a,v| a << [nil, v] }
|
59
|
+
process_params(values, key, all, &block)
|
60
|
+
when Hash
|
61
|
+
process_params(value, key, all, &block)
|
62
|
+
else
|
63
|
+
all << block.call(key, value)
|
95
64
|
end
|
96
65
|
end
|
97
66
|
end
|