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/utils.rb
CHANGED
@@ -1,164 +1,12 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday/utils/headers'
|
4
|
+
require 'faraday/utils/params_hash'
|
3
5
|
|
4
6
|
module Faraday
|
7
|
+
# Utils contains various static helper methods.
|
5
8
|
module Utils
|
6
|
-
|
7
|
-
|
8
|
-
# Adapted from Rack::Utils::HeaderHash
|
9
|
-
class Headers < ::Hash
|
10
|
-
def self.from(value)
|
11
|
-
new(value)
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(hash = nil)
|
15
|
-
super()
|
16
|
-
@names = {}
|
17
|
-
self.update(hash || {})
|
18
|
-
end
|
19
|
-
|
20
|
-
# need to synchronize concurrent writes to the shared KeyMap
|
21
|
-
keymap_mutex = Mutex.new
|
22
|
-
|
23
|
-
# symbol -> string mapper + cache
|
24
|
-
KeyMap = Hash.new do |map, key|
|
25
|
-
value = if key.respond_to?(:to_str)
|
26
|
-
key
|
27
|
-
else
|
28
|
-
key.to_s.split('_'). # :user_agent => %w(user agent)
|
29
|
-
each { |w| w.capitalize! }. # => %w(User Agent)
|
30
|
-
join('-') # => "User-Agent"
|
31
|
-
end
|
32
|
-
keymap_mutex.synchronize { map[key] = value }
|
33
|
-
end
|
34
|
-
KeyMap[:etag] = "ETag"
|
35
|
-
|
36
|
-
def [](k)
|
37
|
-
k = KeyMap[k]
|
38
|
-
super(k) || super(@names[k.downcase])
|
39
|
-
end
|
40
|
-
|
41
|
-
def []=(k, v)
|
42
|
-
k = KeyMap[k]
|
43
|
-
k = (@names[k.downcase] ||= k)
|
44
|
-
# join multiple values with a comma
|
45
|
-
v = v.to_ary.join(', ') if v.respond_to? :to_ary
|
46
|
-
super(k, v)
|
47
|
-
end
|
48
|
-
|
49
|
-
def fetch(k, *args, &block)
|
50
|
-
k = KeyMap[k]
|
51
|
-
key = @names.fetch(k.downcase, k)
|
52
|
-
super(key, *args, &block)
|
53
|
-
end
|
54
|
-
|
55
|
-
def delete(k)
|
56
|
-
k = KeyMap[k]
|
57
|
-
if k = @names[k.downcase]
|
58
|
-
@names.delete k.downcase
|
59
|
-
super(k)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def include?(k)
|
64
|
-
@names.include? k.downcase
|
65
|
-
end
|
66
|
-
|
67
|
-
alias_method :has_key?, :include?
|
68
|
-
alias_method :member?, :include?
|
69
|
-
alias_method :key?, :include?
|
70
|
-
|
71
|
-
def merge!(other)
|
72
|
-
other.each { |k, v| self[k] = v }
|
73
|
-
self
|
74
|
-
end
|
75
|
-
alias_method :update, :merge!
|
76
|
-
|
77
|
-
def merge(other)
|
78
|
-
hash = dup
|
79
|
-
hash.merge! other
|
80
|
-
end
|
81
|
-
|
82
|
-
def replace(other)
|
83
|
-
clear
|
84
|
-
self.update other
|
85
|
-
self
|
86
|
-
end
|
87
|
-
|
88
|
-
def to_hash() ::Hash.new.update(self) end
|
89
|
-
|
90
|
-
def parse(header_string)
|
91
|
-
return unless header_string && !header_string.empty?
|
92
|
-
header_string.split(/\r\n/).
|
93
|
-
tap { |a| a.shift if a.first.index('HTTP/') == 0 }. # drop the HTTP status line
|
94
|
-
map { |h| h.split(/:\s+/, 2) }.reject { |p| p[0].nil? }. # split key and value, ignore blank lines
|
95
|
-
each { |key, value|
|
96
|
-
# join multiple values with a comma
|
97
|
-
if self[key]
|
98
|
-
self[key] << ', ' << value
|
99
|
-
else
|
100
|
-
self[key] = value
|
101
|
-
end
|
102
|
-
}
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
# hash with stringified keys
|
107
|
-
class ParamsHash < Hash
|
108
|
-
def [](key)
|
109
|
-
super(convert_key(key))
|
110
|
-
end
|
111
|
-
|
112
|
-
def []=(key, value)
|
113
|
-
super(convert_key(key), value)
|
114
|
-
end
|
115
|
-
|
116
|
-
def delete(key)
|
117
|
-
super(convert_key(key))
|
118
|
-
end
|
119
|
-
|
120
|
-
def include?(key)
|
121
|
-
super(convert_key(key))
|
122
|
-
end
|
123
|
-
|
124
|
-
alias_method :has_key?, :include?
|
125
|
-
alias_method :member?, :include?
|
126
|
-
alias_method :key?, :include?
|
127
|
-
|
128
|
-
def update(params)
|
129
|
-
params.each do |key, value|
|
130
|
-
self[key] = value
|
131
|
-
end
|
132
|
-
self
|
133
|
-
end
|
134
|
-
alias_method :merge!, :update
|
135
|
-
|
136
|
-
def merge(params)
|
137
|
-
dup.update(params)
|
138
|
-
end
|
139
|
-
|
140
|
-
def replace(other)
|
141
|
-
clear
|
142
|
-
update(other)
|
143
|
-
end
|
144
|
-
|
145
|
-
def merge_query(query, encoder = nil)
|
146
|
-
if query && !query.empty?
|
147
|
-
update((encoder || Utils.default_params_encoder).decode(query))
|
148
|
-
end
|
149
|
-
self
|
150
|
-
end
|
151
|
-
|
152
|
-
def to_query(encoder = nil)
|
153
|
-
(encoder || Utils.default_params_encoder).encode(self)
|
154
|
-
end
|
155
|
-
|
156
|
-
private
|
157
|
-
|
158
|
-
def convert_key(key)
|
159
|
-
key.to_s
|
160
|
-
end
|
161
|
-
end
|
9
|
+
module_function
|
162
10
|
|
163
11
|
def build_query(params)
|
164
12
|
FlatParamsEncoder.encode(params)
|
@@ -168,17 +16,27 @@ module Faraday
|
|
168
16
|
NestedParamsEncoder.encode(params)
|
169
17
|
end
|
170
18
|
|
171
|
-
|
19
|
+
def default_space_encoding
|
20
|
+
@default_space_encoding ||= '+'
|
21
|
+
end
|
172
22
|
|
173
|
-
|
174
|
-
|
175
|
-
'%' + match.unpack('H2' * match.bytesize).join('%').upcase
|
176
|
-
}.tr(' ', '+')
|
23
|
+
class << self
|
24
|
+
attr_writer :default_space_encoding
|
177
25
|
end
|
178
26
|
|
179
|
-
|
27
|
+
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze
|
180
28
|
|
181
|
-
|
29
|
+
def escape(str)
|
30
|
+
str.to_s.gsub(ESCAPE_RE) do |match|
|
31
|
+
"%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
|
32
|
+
end.gsub(' ', default_space_encoding)
|
33
|
+
end
|
34
|
+
|
35
|
+
def unescape(str)
|
36
|
+
CGI.unescape str.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
DEFAULT_SEP = /[&;] */n.freeze
|
182
40
|
|
183
41
|
# Adapted from Rack
|
184
42
|
def parse_query(query)
|
@@ -197,55 +55,18 @@ module Faraday
|
|
197
55
|
attr_writer :default_params_encoder
|
198
56
|
end
|
199
57
|
|
200
|
-
# Stolen from Rack
|
201
|
-
def normalize_params(params, name, v = nil)
|
202
|
-
name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
|
203
|
-
k = $1 || ''
|
204
|
-
after = $' || ''
|
205
|
-
|
206
|
-
return if k.empty?
|
207
|
-
|
208
|
-
if after == ""
|
209
|
-
if params[k]
|
210
|
-
params[k] = Array[params[k]] unless params[k].kind_of?(Array)
|
211
|
-
params[k] << v
|
212
|
-
else
|
213
|
-
params[k] = v
|
214
|
-
end
|
215
|
-
elsif after == "[]"
|
216
|
-
params[k] ||= []
|
217
|
-
raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
|
218
|
-
params[k] << v
|
219
|
-
elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
|
220
|
-
child_key = $1
|
221
|
-
params[k] ||= []
|
222
|
-
raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
|
223
|
-
if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key)
|
224
|
-
normalize_params(params[k].last, child_key, v)
|
225
|
-
else
|
226
|
-
params[k] << normalize_params({}, child_key, v)
|
227
|
-
end
|
228
|
-
else
|
229
|
-
params[k] ||= {}
|
230
|
-
raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash)
|
231
|
-
params[k] = normalize_params(params[k], after, v)
|
232
|
-
end
|
233
|
-
|
234
|
-
return params
|
235
|
-
end
|
236
|
-
|
237
58
|
# Normalize URI() behavior across Ruby versions
|
238
59
|
#
|
239
60
|
# url - A String or URI.
|
240
61
|
#
|
241
62
|
# Returns a parsed URI.
|
242
|
-
def URI(url)
|
63
|
+
def URI(url) # rubocop:disable Naming/MethodName
|
243
64
|
if url.respond_to?(:host)
|
244
65
|
url
|
245
66
|
elsif url.respond_to?(:to_str)
|
246
67
|
default_uri_parser.call(url)
|
247
68
|
else
|
248
|
-
raise ArgumentError,
|
69
|
+
raise ArgumentError, 'bad argument (expected URI object or URI string)'
|
249
70
|
end
|
250
71
|
end
|
251
72
|
|
@@ -258,27 +79,28 @@ module Faraday
|
|
258
79
|
|
259
80
|
def default_uri_parser=(parser)
|
260
81
|
@default_uri_parser = if parser.respond_to?(:call) || parser.nil?
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
82
|
+
parser
|
83
|
+
else
|
84
|
+
parser.method(:parse)
|
85
|
+
end
|
265
86
|
end
|
266
87
|
|
267
|
-
# Receives a String or URI and returns just
|
88
|
+
# Receives a String or URI and returns just
|
89
|
+
# the path with the query string sorted.
|
268
90
|
def normalize_path(url)
|
269
91
|
url = URI(url)
|
270
|
-
(url.path.start_with?('/') ? url.path :
|
271
|
-
|
92
|
+
(url.path.start_with?('/') ? url.path : "/#{url.path}") +
|
93
|
+
(url.query ? "?#{sort_query_params(url.query)}" : '')
|
272
94
|
end
|
273
95
|
|
274
96
|
# Recursive hash update
|
275
97
|
def deep_merge!(target, hash)
|
276
98
|
hash.each do |key, value|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
99
|
+
target[key] = if value.is_a?(Hash) && target[key].is_a?(Hash)
|
100
|
+
deep_merge(target[key], value)
|
101
|
+
else
|
102
|
+
value
|
103
|
+
end
|
282
104
|
end
|
283
105
|
target
|
284
106
|
end
|
@@ -288,8 +110,6 @@ module Faraday
|
|
288
110
|
deep_merge!(source.dup, hash)
|
289
111
|
end
|
290
112
|
|
291
|
-
protected
|
292
|
-
|
293
113
|
def sort_query_params(query)
|
294
114
|
query.split('&').sort.join('&')
|
295
115
|
end
|