faraday 0.9.1 → 2.5.2
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 +554 -0
- data/LICENSE.md +1 -1
- data/README.md +32 -197
- data/Rakefile +4 -68
- data/examples/client_spec.rb +119 -0
- data/examples/client_test.rb +144 -0
- data/lib/faraday/adapter/test.rb +194 -58
- data/lib/faraday/adapter.rb +76 -20
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/connection.rb +341 -212
- data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
- data/lib/faraday/encoders/nested_params_encoder.rb +183 -0
- data/lib/faraday/error.rb +123 -29
- data/lib/faraday/logging/formatter.rb +106 -0
- data/lib/faraday/methods.rb +6 -0
- data/lib/faraday/middleware.rb +18 -25
- data/lib/faraday/middleware_registry.rb +83 -0
- data/lib/faraday/options/connection_options.rb +22 -0
- data/lib/faraday/options/env.rb +199 -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 +69 -0
- data/lib/faraday/options.rb +63 -195
- data/lib/faraday/parameters.rb +4 -180
- data/lib/faraday/rack_builder.rb +99 -59
- data/lib/faraday/request/authorization.rb +37 -30
- data/lib/faraday/request/instrumentation.rb +47 -27
- data/lib/faraday/request/json.rb +55 -0
- data/lib/faraday/request/url_encoded.rb +48 -24
- data/lib/faraday/request.rb +76 -32
- data/lib/faraday/response/json.rb +54 -0
- data/lib/faraday/response/logger.rb +22 -48
- data/lib/faraday/response/raise_error.rb +57 -14
- data/lib/faraday/response.rb +32 -35
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +47 -222
- data/lib/faraday/version.rb +5 -0
- data/lib/faraday.rb +111 -222
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/spec/faraday/adapter/test_spec.rb +413 -0
- data/spec/faraday/adapter_registry_spec.rb +28 -0
- data/spec/faraday/adapter_spec.rb +55 -0
- data/spec/faraday/connection_spec.rb +793 -0
- data/spec/faraday/error_spec.rb +60 -0
- data/spec/faraday/middleware_registry_spec.rb +31 -0
- data/spec/faraday/middleware_spec.rb +52 -0
- data/spec/faraday/options/env_spec.rb +76 -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 +150 -0
- data/spec/faraday/rack_builder_spec.rb +317 -0
- data/spec/faraday/request/authorization_spec.rb +83 -0
- data/spec/faraday/request/instrumentation_spec.rb +74 -0
- data/spec/faraday/request/json_spec.rb +111 -0
- data/spec/faraday/request/url_encoded_spec.rb +93 -0
- data/spec/faraday/request_spec.rb +110 -0
- data/spec/faraday/response/json_spec.rb +117 -0
- data/spec/faraday/response/logger_spec.rb +220 -0
- data/spec/faraday/response/raise_error_spec.rb +172 -0
- data/spec/faraday/response_spec.rb +75 -0
- data/spec/faraday/utils/headers_spec.rb +82 -0
- data/spec/faraday/utils_spec.rb +118 -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 +96 -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 +263 -0
- data/spec/support/streaming_response_checker.rb +35 -0
- metadata +81 -109
- 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/adapter/typhoeus.rb +0 -123
- data/lib/faraday/autoload.rb +0 -84
- data/lib/faraday/request/basic_authentication.rb +0 -13
- data/lib/faraday/request/multipart.rb +0 -63
- data/lib/faraday/request/retry.rb +0 -148
- data/lib/faraday/request/token_authentication.rb +0 -15
- 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,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'base64'
|
|
4
|
+
require 'uri'
|
|
5
|
+
require 'faraday/utils/headers'
|
|
6
|
+
require 'faraday/utils/params_hash'
|
|
3
7
|
|
|
4
8
|
module Faraday
|
|
9
|
+
# Utils contains various static helper methods.
|
|
5
10
|
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
|
|
11
|
+
module_function
|
|
162
12
|
|
|
163
13
|
def build_query(params)
|
|
164
14
|
FlatParamsEncoder.encode(params)
|
|
@@ -168,17 +18,27 @@ module Faraday
|
|
|
168
18
|
NestedParamsEncoder.encode(params)
|
|
169
19
|
end
|
|
170
20
|
|
|
171
|
-
|
|
21
|
+
def default_space_encoding
|
|
22
|
+
@default_space_encoding ||= '+'
|
|
23
|
+
end
|
|
172
24
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
'%' + match.unpack('H2' * match.bytesize).join('%').upcase
|
|
176
|
-
}.tr(' ', '+')
|
|
25
|
+
class << self
|
|
26
|
+
attr_writer :default_space_encoding
|
|
177
27
|
end
|
|
178
28
|
|
|
179
|
-
|
|
29
|
+
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze
|
|
180
30
|
|
|
181
|
-
|
|
31
|
+
def escape(str)
|
|
32
|
+
str.to_s.gsub(ESCAPE_RE) do |match|
|
|
33
|
+
"%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
|
|
34
|
+
end.gsub(' ', default_space_encoding)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def unescape(str)
|
|
38
|
+
CGI.unescape str.to_s
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
DEFAULT_SEP = /[&;] */n.freeze
|
|
182
42
|
|
|
183
43
|
# Adapted from Rack
|
|
184
44
|
def parse_query(query)
|
|
@@ -193,45 +53,14 @@ module Faraday
|
|
|
193
53
|
@default_params_encoder ||= NestedParamsEncoder
|
|
194
54
|
end
|
|
195
55
|
|
|
196
|
-
|
|
197
|
-
|
|
56
|
+
def basic_header_from(login, pass)
|
|
57
|
+
value = Base64.encode64("#{login}:#{pass}")
|
|
58
|
+
value.delete!("\n")
|
|
59
|
+
"Basic #{value}"
|
|
198
60
|
end
|
|
199
61
|
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
62
|
+
class << self
|
|
63
|
+
attr_writer :default_params_encoder
|
|
235
64
|
end
|
|
236
65
|
|
|
237
66
|
# Normalize URI() behavior across Ruby versions
|
|
@@ -239,46 +68,44 @@ module Faraday
|
|
|
239
68
|
# url - A String or URI.
|
|
240
69
|
#
|
|
241
70
|
# Returns a parsed URI.
|
|
242
|
-
def URI(url)
|
|
71
|
+
def URI(url) # rubocop:disable Naming/MethodName
|
|
243
72
|
if url.respond_to?(:host)
|
|
244
73
|
url
|
|
245
74
|
elsif url.respond_to?(:to_str)
|
|
246
75
|
default_uri_parser.call(url)
|
|
247
76
|
else
|
|
248
|
-
raise ArgumentError,
|
|
77
|
+
raise ArgumentError, 'bad argument (expected URI object or URI string)'
|
|
249
78
|
end
|
|
250
79
|
end
|
|
251
80
|
|
|
252
81
|
def default_uri_parser
|
|
253
|
-
@default_uri_parser ||=
|
|
254
|
-
require 'uri'
|
|
255
|
-
Kernel.method(:URI)
|
|
256
|
-
end
|
|
82
|
+
@default_uri_parser ||= Kernel.method(:URI)
|
|
257
83
|
end
|
|
258
84
|
|
|
259
85
|
def default_uri_parser=(parser)
|
|
260
86
|
@default_uri_parser = if parser.respond_to?(:call) || parser.nil?
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
87
|
+
parser
|
|
88
|
+
else
|
|
89
|
+
parser.method(:parse)
|
|
90
|
+
end
|
|
265
91
|
end
|
|
266
92
|
|
|
267
|
-
# Receives a String or URI and returns just
|
|
93
|
+
# Receives a String or URI and returns just
|
|
94
|
+
# the path with the query string sorted.
|
|
268
95
|
def normalize_path(url)
|
|
269
96
|
url = URI(url)
|
|
270
|
-
(url.path.start_with?('/') ? url.path :
|
|
271
|
-
|
|
97
|
+
(url.path.start_with?('/') ? url.path : "/#{url.path}") +
|
|
98
|
+
(url.query ? "?#{sort_query_params(url.query)}" : '')
|
|
272
99
|
end
|
|
273
100
|
|
|
274
101
|
# Recursive hash update
|
|
275
102
|
def deep_merge!(target, hash)
|
|
276
103
|
hash.each do |key, value|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
104
|
+
target[key] = if value.is_a?(Hash) && (target[key].is_a?(Hash) || target[key].is_a?(Options))
|
|
105
|
+
deep_merge(target[key], value)
|
|
106
|
+
else
|
|
107
|
+
value
|
|
108
|
+
end
|
|
282
109
|
end
|
|
283
110
|
target
|
|
284
111
|
end
|
|
@@ -288,8 +115,6 @@ module Faraday
|
|
|
288
115
|
deep_merge!(source.dup, hash)
|
|
289
116
|
end
|
|
290
117
|
|
|
291
|
-
protected
|
|
292
|
-
|
|
293
118
|
def sort_query_params(query)
|
|
294
119
|
query.split('&').sort.join('&')
|
|
295
120
|
end
|