faraday 0.9.1 → 0.16.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/LICENSE.md +1 -1
- data/README.md +30 -195
- data/lib/faraday/adapter/em_http.rb +148 -99
- data/lib/faraday/adapter/em_http_ssl_patch.rb +24 -18
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +18 -15
- data/lib/faraday/adapter/em_synchrony.rb +107 -49
- data/lib/faraday/adapter/excon.rb +102 -55
- data/lib/faraday/adapter/httpclient.rb +80 -36
- data/lib/faraday/adapter/net_http.rb +119 -44
- data/lib/faraday/adapter/net_http_persistent.rb +68 -27
- data/lib/faraday/adapter/patron.rb +76 -34
- data/lib/faraday/adapter/rack.rb +28 -12
- data/lib/faraday/adapter/test.rb +136 -52
- data/lib/faraday/adapter/typhoeus.rb +7 -115
- data/lib/faraday/adapter.rb +43 -20
- data/lib/faraday/adapter_registry.rb +28 -0
- data/lib/faraday/autoload.rb +47 -36
- data/lib/faraday/connection.rb +359 -165
- data/lib/faraday/dependency_loader.rb +37 -0
- data/lib/faraday/encoders/flat_params_encoder.rb +94 -0
- data/lib/faraday/encoders/nested_params_encoder.rb +171 -0
- data/lib/faraday/error.rb +71 -24
- data/lib/faraday/file_part.rb +128 -0
- data/lib/faraday/logging/formatter.rb +92 -0
- data/lib/faraday/middleware.rb +4 -28
- 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 +28 -0
- data/lib/faraday/options/request_options.rb +21 -0
- data/lib/faraday/options/ssl_options.rb +59 -0
- data/lib/faraday/options.rb +57 -185
- data/lib/faraday/param_part.rb +53 -0
- data/lib/faraday/parameters.rb +4 -180
- data/lib/faraday/rack_builder.rb +74 -38
- data/lib/faraday/request/authorization.rb +42 -31
- data/lib/faraday/request/basic_authentication.rb +14 -7
- data/lib/faraday/request/instrumentation.rb +45 -27
- data/lib/faraday/request/multipart.rb +81 -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 +41 -23
- data/lib/faraday/request.rb +84 -30
- data/lib/faraday/response/logger.rb +22 -48
- data/lib/faraday/response/raise_error.rb +36 -14
- data/lib/faraday/response.rb +29 -18
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +28 -216
- data/lib/faraday.rb +102 -204
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- metadata +24 -94
- data/.document +0 -6
- data/CHANGELOG.md +0 -20
- data/CONTRIBUTING.md +0 -36
- data/Gemfile +0 -25
- data/Rakefile +0 -71
- data/faraday.gemspec +0 -34
- 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,19 @@ module Faraday
|
|
|
168
16
|
NestedParamsEncoder.encode(params)
|
|
169
17
|
end
|
|
170
18
|
|
|
171
|
-
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]
|
|
19
|
+
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze
|
|
172
20
|
|
|
173
|
-
def escape(
|
|
174
|
-
|
|
21
|
+
def escape(str)
|
|
22
|
+
str.to_s.gsub(ESCAPE_RE) do |match|
|
|
175
23
|
'%' + match.unpack('H2' * match.bytesize).join('%').upcase
|
|
176
|
-
|
|
24
|
+
end.tr(' ', '+')
|
|
177
25
|
end
|
|
178
26
|
|
|
179
|
-
def unescape(
|
|
27
|
+
def unescape(str)
|
|
28
|
+
CGI.unescape str.to_s
|
|
29
|
+
end
|
|
180
30
|
|
|
181
|
-
DEFAULT_SEP = /[&;] */n
|
|
31
|
+
DEFAULT_SEP = /[&;] */n.freeze
|
|
182
32
|
|
|
183
33
|
# Adapted from Rack
|
|
184
34
|
def parse_query(query)
|
|
@@ -197,55 +47,18 @@ module Faraday
|
|
|
197
47
|
attr_writer :default_params_encoder
|
|
198
48
|
end
|
|
199
49
|
|
|
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
50
|
# Normalize URI() behavior across Ruby versions
|
|
238
51
|
#
|
|
239
52
|
# url - A String or URI.
|
|
240
53
|
#
|
|
241
54
|
# Returns a parsed URI.
|
|
242
|
-
def URI(url)
|
|
55
|
+
def URI(url) # rubocop:disable Naming/MethodName
|
|
243
56
|
if url.respond_to?(:host)
|
|
244
57
|
url
|
|
245
58
|
elsif url.respond_to?(:to_str)
|
|
246
59
|
default_uri_parser.call(url)
|
|
247
60
|
else
|
|
248
|
-
raise ArgumentError,
|
|
61
|
+
raise ArgumentError, 'bad argument (expected URI object or URI string)'
|
|
249
62
|
end
|
|
250
63
|
end
|
|
251
64
|
|
|
@@ -258,27 +71,28 @@ module Faraday
|
|
|
258
71
|
|
|
259
72
|
def default_uri_parser=(parser)
|
|
260
73
|
@default_uri_parser = if parser.respond_to?(:call) || parser.nil?
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
74
|
+
parser
|
|
75
|
+
else
|
|
76
|
+
parser.method(:parse)
|
|
77
|
+
end
|
|
265
78
|
end
|
|
266
79
|
|
|
267
|
-
# Receives a String or URI and returns just
|
|
80
|
+
# Receives a String or URI and returns just
|
|
81
|
+
# the path with the query string sorted.
|
|
268
82
|
def normalize_path(url)
|
|
269
83
|
url = URI(url)
|
|
270
84
|
(url.path.start_with?('/') ? url.path : '/' + url.path) +
|
|
271
|
-
|
|
85
|
+
(url.query ? "?#{sort_query_params(url.query)}" : '')
|
|
272
86
|
end
|
|
273
87
|
|
|
274
88
|
# Recursive hash update
|
|
275
89
|
def deep_merge!(target, hash)
|
|
276
90
|
hash.each do |key, value|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
91
|
+
target[key] = if value.is_a?(Hash) && target[key].is_a?(Hash)
|
|
92
|
+
deep_merge(target[key], value)
|
|
93
|
+
else
|
|
94
|
+
value
|
|
95
|
+
end
|
|
282
96
|
end
|
|
283
97
|
target
|
|
284
98
|
end
|
|
@@ -288,8 +102,6 @@ module Faraday
|
|
|
288
102
|
deep_merge!(source.dup, hash)
|
|
289
103
|
end
|
|
290
104
|
|
|
291
|
-
protected
|
|
292
|
-
|
|
293
105
|
def sort_query_params(query)
|
|
294
106
|
query.split('&').sort.join('&')
|
|
295
107
|
end
|
data/lib/faraday.rb
CHANGED
|
@@ -1,130 +1,156 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'cgi'
|
|
3
4
|
require 'set'
|
|
4
5
|
require 'forwardable'
|
|
6
|
+
require 'faraday/middleware_registry'
|
|
7
|
+
require 'faraday/dependency_loader'
|
|
5
8
|
|
|
6
|
-
#
|
|
7
|
-
# create Faraday::Connection objects, or access it directly.
|
|
9
|
+
# This is the main namespace for Faraday.
|
|
8
10
|
#
|
|
9
|
-
#
|
|
11
|
+
# It provides methods to create {Connection} objects, and HTTP-related
|
|
12
|
+
# methods to use directly.
|
|
10
13
|
#
|
|
14
|
+
# @example Helpful class methods for easy usage
|
|
11
15
|
# Faraday.get "http://faraday.com"
|
|
12
16
|
#
|
|
17
|
+
# @example Helpful class method `.new` to create {Connection} objects.
|
|
13
18
|
# conn = Faraday.new "http://faraday.com"
|
|
14
19
|
# conn.get '/'
|
|
15
20
|
#
|
|
16
21
|
module Faraday
|
|
17
|
-
VERSION =
|
|
22
|
+
VERSION = '0.16.0'
|
|
23
|
+
METHODS_WITH_QUERY = %w[get head delete connect trace].freeze
|
|
24
|
+
METHODS_WITH_BODY = %w[post put patch].freeze
|
|
18
25
|
|
|
19
26
|
class << self
|
|
20
|
-
#
|
|
21
|
-
#
|
|
27
|
+
# The root path that Faraday is being loaded from.
|
|
28
|
+
#
|
|
29
|
+
# This is the root from where the libraries are auto-loaded.
|
|
30
|
+
#
|
|
31
|
+
# @return [String]
|
|
22
32
|
attr_accessor :root_path
|
|
23
33
|
|
|
24
|
-
#
|
|
34
|
+
# Gets or sets the path that the Faraday libs are loaded from.
|
|
35
|
+
# @return [String]
|
|
25
36
|
attr_accessor :lib_path
|
|
26
37
|
|
|
27
|
-
#
|
|
28
|
-
#
|
|
38
|
+
# @overload default_adapter
|
|
39
|
+
# Gets the Symbol key identifying a default Adapter to use
|
|
40
|
+
# for the default {Faraday::Connection}. Defaults to `:net_http`.
|
|
41
|
+
# @return [Symbol] the default adapter
|
|
42
|
+
# @overload default_adapter=(adapter)
|
|
43
|
+
# Updates default adapter while resetting {.default_connection}.
|
|
44
|
+
# @return [Symbol] the new default_adapter.
|
|
29
45
|
attr_reader :default_adapter
|
|
30
46
|
|
|
31
|
-
#
|
|
32
|
-
# access the Faraday constant directly.
|
|
33
|
-
#
|
|
34
|
-
# Faraday.get "https://faraday.com"
|
|
47
|
+
# Documented below, see default_connection
|
|
35
48
|
attr_writer :default_connection
|
|
36
49
|
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
50
|
+
# Tells Faraday to ignore the environment proxy (http_proxy).
|
|
51
|
+
# Defaults to `false`.
|
|
52
|
+
# @return [Boolean]
|
|
53
|
+
attr_accessor :ignore_env_proxy
|
|
54
|
+
|
|
55
|
+
# Initializes a new {Connection}.
|
|
56
|
+
#
|
|
57
|
+
# @param url [String,Hash] The optional String base URL to use as a prefix
|
|
58
|
+
# for all requests. Can also be the options Hash. Any of these
|
|
59
|
+
# values will be set on every request made, unless overridden
|
|
60
|
+
# for a specific request.
|
|
61
|
+
# @param options [Hash]
|
|
62
|
+
# @option options [String] :url Base URL
|
|
63
|
+
# @option options [Hash] :params Hash of unencoded URI query params.
|
|
64
|
+
# @option options [Hash] :headers Hash of unencoded HTTP headers.
|
|
65
|
+
# @option options [Hash] :request Hash of request options.
|
|
66
|
+
# @option options [Hash] :ssl Hash of SSL options.
|
|
67
|
+
# @option options [Hash] :proxy Hash of Proxy options.
|
|
68
|
+
# @return [Faraday::Connection]
|
|
69
|
+
#
|
|
70
|
+
# @example With an URL argument
|
|
56
71
|
# Faraday.new 'http://faraday.com'
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
# #
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
def new(url = nil, options =
|
|
68
|
-
|
|
69
|
-
options = options ? default_connection_options.merge(options) : default_connection_options.dup
|
|
72
|
+
# # => Faraday::Connection to http://faraday.com
|
|
73
|
+
#
|
|
74
|
+
# @example With an URL argument and an options hash
|
|
75
|
+
# Faraday.new 'http://faraday.com', params: { page: 1 }
|
|
76
|
+
# # => Faraday::Connection to http://faraday.com?page=1
|
|
77
|
+
#
|
|
78
|
+
# @example With everything in an options hash
|
|
79
|
+
# Faraday.new url: 'http://faraday.com',
|
|
80
|
+
# params: { page: 1 }
|
|
81
|
+
# # => Faraday::Connection to http://faraday.com?page=1
|
|
82
|
+
def new(url = nil, options = {}, &block)
|
|
83
|
+
options = default_connection_options.merge(options)
|
|
70
84
|
Faraday::Connection.new(url, options, &block)
|
|
71
85
|
end
|
|
72
86
|
|
|
87
|
+
# @private
|
|
73
88
|
# Internal: Requires internal Faraday libraries.
|
|
74
89
|
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
# Returns nothing.
|
|
90
|
+
# @param libs [Array] one or more relative String names to Faraday classes.
|
|
91
|
+
# @return [void]
|
|
78
92
|
def require_libs(*libs)
|
|
79
93
|
libs.each do |lib|
|
|
80
94
|
require "#{lib_path}/#{lib}"
|
|
81
95
|
end
|
|
82
96
|
end
|
|
83
97
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
#
|
|
87
|
-
# Returns the new default_adapter.
|
|
98
|
+
alias require_lib require_libs
|
|
99
|
+
|
|
100
|
+
# Documented elsewhere, see default_adapter reader
|
|
88
101
|
def default_adapter=(adapter)
|
|
89
102
|
@default_connection = nil
|
|
90
103
|
@default_adapter = adapter
|
|
91
104
|
end
|
|
92
105
|
|
|
93
|
-
|
|
106
|
+
def respond_to_missing?(symbol, include_private = false)
|
|
107
|
+
default_connection.respond_to?(symbol, include_private) || super
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
private
|
|
94
111
|
|
|
95
|
-
private
|
|
96
112
|
# Internal: Proxies method calls on the Faraday constant to
|
|
97
|
-
#
|
|
113
|
+
# .default_connection.
|
|
98
114
|
def method_missing(name, *args, &block)
|
|
99
|
-
default_connection.
|
|
115
|
+
if default_connection.respond_to?(name)
|
|
116
|
+
default_connection.send(name, *args, &block)
|
|
117
|
+
else
|
|
118
|
+
super
|
|
119
|
+
end
|
|
100
120
|
end
|
|
101
121
|
end
|
|
102
122
|
|
|
103
|
-
self.
|
|
104
|
-
self.
|
|
123
|
+
self.ignore_env_proxy = false
|
|
124
|
+
self.root_path = File.expand_path __dir__
|
|
125
|
+
self.lib_path = File.expand_path 'faraday', __dir__
|
|
105
126
|
self.default_adapter = :net_http
|
|
106
127
|
|
|
107
|
-
#
|
|
108
|
-
#
|
|
109
|
-
#
|
|
128
|
+
# @overload default_connection
|
|
129
|
+
# Gets the default connection used for simple scripts.
|
|
130
|
+
# @return [Faraday::Connection] a connection configured with
|
|
131
|
+
# the default_adapter.
|
|
132
|
+
# @overload default_connection=(connection)
|
|
133
|
+
# @param connection [Faraday::Connection]
|
|
134
|
+
# Sets the default {Faraday::Connection} for simple scripts that
|
|
135
|
+
# access the Faraday constant directly, such as
|
|
136
|
+
# <code>Faraday.get "https://faraday.com"</code>.
|
|
110
137
|
def self.default_connection
|
|
111
|
-
@default_connection ||= Connection.new
|
|
138
|
+
@default_connection ||= Connection.new(default_connection_options)
|
|
112
139
|
end
|
|
113
140
|
|
|
114
|
-
# Gets the default connection options used when calling Faraday#new.
|
|
141
|
+
# Gets the default connection options used when calling {Faraday#new}.
|
|
115
142
|
#
|
|
116
|
-
#
|
|
143
|
+
# @return [Faraday::ConnectionOptions]
|
|
117
144
|
def self.default_connection_options
|
|
118
145
|
@default_connection_options ||= ConnectionOptions.new
|
|
119
146
|
end
|
|
120
147
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
end
|
|
148
|
+
# Sets the default options used when calling {Faraday#new}.
|
|
149
|
+
#
|
|
150
|
+
# @param options [Hash, Faraday::ConnectionOptions]
|
|
151
|
+
def self.default_connection_options=(options)
|
|
152
|
+
@default_connection = nil
|
|
153
|
+
@default_connection_options = ConnectionOptions.from(options)
|
|
128
154
|
end
|
|
129
155
|
|
|
130
156
|
unless const_defined? :Timer
|
|
@@ -132,137 +158,9 @@ module Faraday
|
|
|
132
158
|
Timer = Timeout
|
|
133
159
|
end
|
|
134
160
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
# Public: Register middleware class(es) on the current module.
|
|
139
|
-
#
|
|
140
|
-
# mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
|
|
141
|
-
# as fully qualified constant, or a Proc that will be lazily
|
|
142
|
-
# called to return the former.
|
|
143
|
-
#
|
|
144
|
-
# Examples
|
|
145
|
-
#
|
|
146
|
-
# module Faraday
|
|
147
|
-
# class Whatever
|
|
148
|
-
# # Middleware looked up by :foo returns Faraday::Whatever::Foo.
|
|
149
|
-
# register_middleware :foo => Foo
|
|
150
|
-
#
|
|
151
|
-
# # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar)
|
|
152
|
-
# register_middleware :bar => :Bar
|
|
153
|
-
#
|
|
154
|
-
# # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz)
|
|
155
|
-
# register_middleware :baz => [:Baz, 'baz']
|
|
156
|
-
# end
|
|
157
|
-
# end
|
|
158
|
-
#
|
|
159
|
-
# Returns nothing.
|
|
160
|
-
def register_middleware(autoload_path = nil, mapping = nil)
|
|
161
|
-
if mapping.nil?
|
|
162
|
-
mapping = autoload_path
|
|
163
|
-
autoload_path = nil
|
|
164
|
-
end
|
|
165
|
-
middleware_mutex do
|
|
166
|
-
@middleware_autoload_path = autoload_path if autoload_path
|
|
167
|
-
(@registered_middleware ||= {}).update(mapping)
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
# Public: Lookup middleware class with a registered Symbol shortcut.
|
|
172
|
-
#
|
|
173
|
-
# key - The Symbol key for the registered middleware.
|
|
174
|
-
#
|
|
175
|
-
# Examples
|
|
176
|
-
#
|
|
177
|
-
# module Faraday
|
|
178
|
-
# class Whatever
|
|
179
|
-
# register_middleware :foo => Foo
|
|
180
|
-
# end
|
|
181
|
-
# end
|
|
182
|
-
#
|
|
183
|
-
# Faraday::Whatever.lookup_middleware(:foo)
|
|
184
|
-
# # => Faraday::Whatever::Foo
|
|
185
|
-
#
|
|
186
|
-
# Returns a middleware Class.
|
|
187
|
-
def lookup_middleware(key)
|
|
188
|
-
load_middleware(key) ||
|
|
189
|
-
raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}"))
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
def middleware_mutex(&block)
|
|
193
|
-
@middleware_mutex ||= begin
|
|
194
|
-
require 'monitor'
|
|
195
|
-
Monitor.new
|
|
196
|
-
end
|
|
197
|
-
@middleware_mutex.synchronize(&block)
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
def fetch_middleware(key)
|
|
201
|
-
defined?(@registered_middleware) && @registered_middleware[key]
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
def load_middleware(key)
|
|
205
|
-
value = fetch_middleware(key)
|
|
206
|
-
case value
|
|
207
|
-
when Module
|
|
208
|
-
value
|
|
209
|
-
when Symbol, String
|
|
210
|
-
middleware_mutex do
|
|
211
|
-
@registered_middleware[key] = const_get(value)
|
|
212
|
-
end
|
|
213
|
-
when Proc
|
|
214
|
-
middleware_mutex do
|
|
215
|
-
@registered_middleware[key] = value.call
|
|
216
|
-
end
|
|
217
|
-
when Array
|
|
218
|
-
middleware_mutex do
|
|
219
|
-
const, path = value
|
|
220
|
-
if root = @middleware_autoload_path
|
|
221
|
-
path = "#{root}/#{path}"
|
|
222
|
-
end
|
|
223
|
-
require(path)
|
|
224
|
-
@registered_middleware[key] = const
|
|
225
|
-
end
|
|
226
|
-
load_middleware(key)
|
|
227
|
-
end
|
|
228
|
-
end
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def self.const_missing(name)
|
|
232
|
-
if name.to_sym == :Builder
|
|
233
|
-
warn "Faraday::Builder is now Faraday::RackBuilder."
|
|
234
|
-
const_set name, RackBuilder
|
|
235
|
-
else
|
|
236
|
-
super
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
require_libs "utils", "options", "connection", "rack_builder", "parameters",
|
|
241
|
-
"middleware", "adapter", "request", "response", "upload_io", "error"
|
|
242
|
-
|
|
243
|
-
if !ENV["FARADAY_NO_AUTOLOAD"]
|
|
244
|
-
require_lib 'autoload'
|
|
245
|
-
end
|
|
246
|
-
end
|
|
161
|
+
require_libs 'utils', 'options', 'connection', 'rack_builder', 'parameters',
|
|
162
|
+
'middleware', 'adapter', 'request', 'response', 'error',
|
|
163
|
+
'file_part', 'param_part'
|
|
247
164
|
|
|
248
|
-
|
|
249
|
-
class Object
|
|
250
|
-
# The primary purpose of this method is to "tap into" a method chain,
|
|
251
|
-
# in order to perform operations on intermediate results within the chain.
|
|
252
|
-
#
|
|
253
|
-
# Examples
|
|
254
|
-
#
|
|
255
|
-
# (1..10).tap { |x| puts "original: #{x.inspect}" }.to_a.
|
|
256
|
-
# tap { |x| puts "array: #{x.inspect}" }.
|
|
257
|
-
# select { |x| x%2 == 0 }.
|
|
258
|
-
# tap { |x| puts "evens: #{x.inspect}" }.
|
|
259
|
-
# map { |x| x*x }.
|
|
260
|
-
# tap { |x| puts "squares: #{x.inspect}" }
|
|
261
|
-
#
|
|
262
|
-
# Yields self.
|
|
263
|
-
# Returns self.
|
|
264
|
-
def tap
|
|
265
|
-
yield(self)
|
|
266
|
-
self
|
|
267
|
-
end unless Object.respond_to?(:tap)
|
|
165
|
+
require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
|
|
268
166
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'webmock/rspec'
|
|
4
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
|
5
|
+
|
|
6
|
+
require_relative '../support/helper_methods'
|
|
7
|
+
require_relative '../support/disabling_stub'
|
|
8
|
+
require_relative '../support/streaming_response_checker'
|
|
9
|
+
require_relative '../support/shared_examples/adapter'
|
|
10
|
+
require_relative '../support/shared_examples/request_method'
|
|
11
|
+
|
|
12
|
+
RSpec.configure do |config|
|
|
13
|
+
config.include Faraday::HelperMethods
|
|
14
|
+
end
|