faraday 0.9.2 → 0.17.6
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 +7 -0
- data/CHANGELOG.md +232 -0
- data/LICENSE.md +1 -1
- data/README.md +168 -18
- data/Rakefile +13 -0
- data/lib/faraday/adapter/em_http.rb +17 -11
- data/lib/faraday/adapter/em_http_ssl_patch.rb +1 -1
- data/lib/faraday/adapter/em_synchrony.rb +13 -7
- data/lib/faraday/adapter/excon.rb +12 -11
- data/lib/faraday/adapter/httpclient.rb +21 -10
- data/lib/faraday/adapter/net_http.rb +36 -13
- data/lib/faraday/adapter/net_http_persistent.rb +36 -17
- data/lib/faraday/adapter/patron.rb +36 -19
- data/lib/faraday/adapter/rack.rb +1 -1
- data/lib/faraday/adapter/test.rb +79 -28
- data/lib/faraday/adapter/typhoeus.rb +4 -115
- data/lib/faraday/adapter.rb +10 -1
- data/lib/faraday/autoload.rb +1 -1
- data/lib/faraday/connection.rb +64 -17
- data/lib/faraday/deprecate.rb +109 -0
- data/lib/faraday/error.rb +132 -27
- data/lib/faraday/options.rb +36 -22
- data/lib/faraday/parameters.rb +2 -1
- data/lib/faraday/rack_builder.rb +26 -2
- data/lib/faraday/request/authorization.rb +1 -2
- data/lib/faraday/request/multipart.rb +7 -2
- data/lib/faraday/request/retry.rb +77 -18
- data/lib/faraday/request.rb +24 -0
- data/lib/faraday/response/logger.rb +29 -8
- data/lib/faraday/response/raise_error.rb +7 -3
- data/lib/faraday/response.rb +7 -3
- data/lib/faraday/upload_io.rb +16 -6
- data/lib/faraday/utils.rb +19 -2
- data/lib/faraday.rb +15 -36
- data/spec/faraday/deprecate_spec.rb +147 -0
- data/spec/faraday/error_spec.rb +102 -0
- data/spec/faraday/response/raise_error_spec.rb +106 -0
- data/spec/spec_helper.rb +105 -0
- data/test/adapters/default_test.rb +14 -0
- data/test/adapters/em_http_test.rb +30 -0
- data/test/adapters/em_synchrony_test.rb +32 -0
- data/test/adapters/excon_test.rb +30 -0
- data/test/adapters/httpclient_test.rb +34 -0
- data/test/adapters/integration.rb +263 -0
- data/test/adapters/logger_test.rb +136 -0
- data/test/adapters/net_http_persistent_test.rb +114 -0
- data/test/adapters/net_http_test.rb +79 -0
- data/test/adapters/patron_test.rb +40 -0
- data/test/adapters/rack_test.rb +38 -0
- data/test/adapters/test_middleware_test.rb +157 -0
- data/test/adapters/typhoeus_test.rb +38 -0
- data/test/authentication_middleware_test.rb +65 -0
- data/test/composite_read_io_test.rb +109 -0
- data/test/connection_test.rb +738 -0
- data/test/env_test.rb +268 -0
- data/test/helper.rb +75 -0
- data/test/live_server.rb +67 -0
- data/test/middleware/instrumentation_test.rb +88 -0
- data/test/middleware/retry_test.rb +282 -0
- data/test/middleware_stack_test.rb +260 -0
- data/test/multibyte.txt +1 -0
- data/test/options_test.rb +333 -0
- data/test/parameters_test.rb +157 -0
- data/test/request_middleware_test.rb +126 -0
- data/test/response_middleware_test.rb +72 -0
- data/test/strawberry.rb +2 -0
- data/test/utils_test.rb +98 -0
- metadata +81 -63
@@ -1,123 +1,12 @@
|
|
1
1
|
module Faraday
|
2
2
|
class Adapter
|
3
|
+
# This class is just a stub, the real adapter is in https://github.com/philsturgeon/typhoeus/blob/master/lib/typhoeus/adapters/faraday.rb
|
3
4
|
class Typhoeus < Faraday::Adapter
|
4
|
-
|
5
|
-
|
6
|
-
def self.setup_parallel_manager(options = {})
|
7
|
-
options.empty? ? ::Typhoeus::Hydra.hydra : ::Typhoeus::Hydra.new(options)
|
8
|
-
end
|
5
|
+
# Needs to define this method in order to support Typhoeus <= 1.3.0
|
6
|
+
def call; end
|
9
7
|
|
10
8
|
dependency 'typhoeus'
|
11
|
-
|
12
|
-
def call(env)
|
13
|
-
super
|
14
|
-
perform_request env
|
15
|
-
@app.call env
|
16
|
-
end
|
17
|
-
|
18
|
-
def perform_request(env)
|
19
|
-
read_body env
|
20
|
-
|
21
|
-
hydra = env[:parallel_manager] || self.class.setup_parallel_manager
|
22
|
-
hydra.queue request(env)
|
23
|
-
hydra.run unless parallel?(env)
|
24
|
-
rescue Errno::ECONNREFUSED
|
25
|
-
raise Error::ConnectionFailed, $!
|
26
|
-
end
|
27
|
-
|
28
|
-
# TODO: support streaming requests
|
29
|
-
def read_body(env)
|
30
|
-
env[:body] = env[:body].read if env[:body].respond_to? :read
|
31
|
-
end
|
32
|
-
|
33
|
-
def request(env)
|
34
|
-
method = env[:method]
|
35
|
-
# For some reason, prevents Typhoeus from using "100-continue".
|
36
|
-
# We want this because Webrick 1.3.1 can't seem to handle it w/ PUT.
|
37
|
-
method = method.to_s.upcase if method == :put
|
38
|
-
|
39
|
-
req = ::Typhoeus::Request.new env[:url].to_s,
|
40
|
-
:method => method,
|
41
|
-
:body => env[:body],
|
42
|
-
:headers => env[:request_headers],
|
43
|
-
:disable_ssl_peer_verification => (env[:ssl] && env[:ssl].disable?)
|
44
|
-
|
45
|
-
configure_ssl req, env
|
46
|
-
configure_proxy req, env
|
47
|
-
configure_timeout req, env
|
48
|
-
configure_socket req, env
|
49
|
-
|
50
|
-
req.on_complete do |resp|
|
51
|
-
if resp.timed_out?
|
52
|
-
if parallel?(env)
|
53
|
-
# TODO: error callback in async mode
|
54
|
-
else
|
55
|
-
raise Faraday::Error::TimeoutError, "request timed out"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
case resp.curl_return_code
|
60
|
-
when 0
|
61
|
-
# everything OK
|
62
|
-
when 7
|
63
|
-
raise Error::ConnectionFailed, resp.curl_error_message
|
64
|
-
when 60
|
65
|
-
raise Faraday::SSLError, resp.curl_error_message
|
66
|
-
else
|
67
|
-
raise Error::ClientError, resp.curl_error_message
|
68
|
-
end
|
69
|
-
|
70
|
-
save_response(env, resp.code, resp.body) do |response_headers|
|
71
|
-
response_headers.parse resp.headers
|
72
|
-
end
|
73
|
-
# in async mode, :response is initialized at this point
|
74
|
-
env[:response].finish(env) if parallel?(env)
|
75
|
-
end
|
76
|
-
|
77
|
-
req
|
78
|
-
end
|
79
|
-
|
80
|
-
def configure_ssl(req, env)
|
81
|
-
ssl = env[:ssl]
|
82
|
-
|
83
|
-
req.ssl_version = ssl[:version] if ssl[:version]
|
84
|
-
req.ssl_cert = ssl[:client_cert] if ssl[:client_cert]
|
85
|
-
req.ssl_key = ssl[:client_key] if ssl[:client_key]
|
86
|
-
req.ssl_cacert = ssl[:ca_file] if ssl[:ca_file]
|
87
|
-
req.ssl_capath = ssl[:ca_path] if ssl[:ca_path]
|
88
|
-
end
|
89
|
-
|
90
|
-
def configure_proxy(req, env)
|
91
|
-
proxy = request_options(env)[:proxy]
|
92
|
-
return unless proxy
|
93
|
-
|
94
|
-
req.proxy = "#{proxy[:uri].host}:#{proxy[:uri].port}"
|
95
|
-
|
96
|
-
if proxy[:user] && proxy[:password]
|
97
|
-
req.proxy_username = proxy[:user]
|
98
|
-
req.proxy_password = proxy[:password]
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def configure_timeout(req, env)
|
103
|
-
env_req = request_options(env)
|
104
|
-
req.timeout = req.connect_timeout = (env_req[:timeout] * 1000) if env_req[:timeout]
|
105
|
-
req.connect_timeout = (env_req[:open_timeout] * 1000) if env_req[:open_timeout]
|
106
|
-
end
|
107
|
-
|
108
|
-
def configure_socket(req, env)
|
109
|
-
if bind = request_options(env)[:bind]
|
110
|
-
req.interface = bind[:host]
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def request_options(env)
|
115
|
-
env[:request]
|
116
|
-
end
|
117
|
-
|
118
|
-
def parallel?(env)
|
119
|
-
!!env[:parallel_manager]
|
120
|
-
end
|
9
|
+
dependency 'typhoeus/adapters/faraday'
|
121
10
|
end
|
122
11
|
end
|
123
12
|
end
|
data/lib/faraday/adapter.rb
CHANGED
@@ -30,13 +30,22 @@ module Faraday
|
|
30
30
|
extend Parallelism
|
31
31
|
self.supports_parallel = false
|
32
32
|
|
33
|
+
def initialize(app = nil, opts = {}, &block)
|
34
|
+
super(app)
|
35
|
+
@connection_options = opts
|
36
|
+
@config_block = block
|
37
|
+
end
|
38
|
+
|
33
39
|
def call(env)
|
34
40
|
env.clear_body if env.needs_body?
|
35
41
|
end
|
36
42
|
|
37
|
-
|
43
|
+
private
|
44
|
+
|
45
|
+
def save_response(env, status, body, headers = nil, reason_phrase = nil)
|
38
46
|
env.status = status
|
39
47
|
env.body = body
|
48
|
+
env.reason_phrase = reason_phrase && reason_phrase.to_s.strip
|
40
49
|
env.response_headers = Utils::Headers.new.tap do |response_headers|
|
41
50
|
response_headers.update headers unless headers.nil?
|
42
51
|
yield(response_headers) if block_given?
|
data/lib/faraday/autoload.rb
CHANGED
@@ -53,9 +53,9 @@ module Faraday
|
|
53
53
|
autoload_all 'faraday/adapter',
|
54
54
|
:NetHttp => 'net_http',
|
55
55
|
:NetHttpPersistent => 'net_http_persistent',
|
56
|
-
:Typhoeus => 'typhoeus',
|
57
56
|
:EMSynchrony => 'em_synchrony',
|
58
57
|
:EMHttp => 'em_http',
|
58
|
+
:Typhoeus => 'typhoeus',
|
59
59
|
:Patron => 'patron',
|
60
60
|
:Excon => 'excon',
|
61
61
|
:Test => 'test',
|
data/lib/faraday/connection.rb
CHANGED
@@ -39,6 +39,9 @@ module Faraday
|
|
39
39
|
# Public: Sets the default parallel manager for this connection.
|
40
40
|
attr_writer :default_parallel_manager
|
41
41
|
|
42
|
+
# Public: Gets or Sets the Hash proxy options.
|
43
|
+
# attr_reader :proxy
|
44
|
+
|
42
45
|
# Public: Initializes a new Faraday::Connection.
|
43
46
|
#
|
44
47
|
# url - URI or String base URL to use as a prefix for all
|
@@ -55,11 +58,11 @@ module Faraday
|
|
55
58
|
# :user - String (optional)
|
56
59
|
# :password - String (optional)
|
57
60
|
def initialize(url = nil, options = nil)
|
58
|
-
|
59
|
-
|
61
|
+
options = ConnectionOptions.from(options)
|
62
|
+
|
63
|
+
if url.is_a?(Hash) || url.is_a?(ConnectionOptions)
|
64
|
+
options = options.merge(url)
|
60
65
|
url = options.url
|
61
|
-
else
|
62
|
-
options = ConnectionOptions.from(options)
|
63
66
|
end
|
64
67
|
|
65
68
|
@parallel_manager = nil
|
@@ -79,14 +82,9 @@ module Faraday
|
|
79
82
|
@params.update(options.params) if options.params
|
80
83
|
@headers.update(options.headers) if options.headers
|
81
84
|
|
82
|
-
@
|
83
|
-
proxy(options.
|
84
|
-
|
85
|
-
if uri && !uri.empty?
|
86
|
-
uri = 'http://' + uri if uri !~ /^http/i
|
87
|
-
uri
|
88
|
-
end
|
89
|
-
})
|
85
|
+
@manual_proxy = !!options.proxy
|
86
|
+
@proxy = options.proxy ? ProxyOptions.from(options.proxy) : proxy_from_env(url)
|
87
|
+
@temp_proxy = @proxy
|
90
88
|
|
91
89
|
yield(self) if block_given?
|
92
90
|
|
@@ -126,7 +124,7 @@ module Faraday
|
|
126
124
|
# req.body = JSON.generate(:query => {...})
|
127
125
|
# end
|
128
126
|
#
|
129
|
-
# Yields a Faraday::
|
127
|
+
# Yields a Faraday::Request for further request customizations.
|
130
128
|
# Returns a Faraday::Response.
|
131
129
|
#
|
132
130
|
# Signature
|
@@ -163,7 +161,7 @@ module Faraday
|
|
163
161
|
# req.body = JSON.generate(:user => 'kimchy', ...)
|
164
162
|
# end
|
165
163
|
#
|
166
|
-
# Yields a Faraday::
|
164
|
+
# Yields a Faraday::Request for further request customizations.
|
167
165
|
# Returns a Faraday::Response.
|
168
166
|
#
|
169
167
|
# Signature
|
@@ -283,9 +281,17 @@ module Faraday
|
|
283
281
|
# Public: Gets or Sets the Hash proxy options.
|
284
282
|
def proxy(arg = nil)
|
285
283
|
return @proxy if arg.nil?
|
284
|
+
warn 'Warning: use of proxy(new_value) to set connection proxy have been DEPRECATED and will be removed in Faraday 1.0'
|
285
|
+
@manual_proxy = true
|
286
286
|
@proxy = ProxyOptions.from(arg)
|
287
287
|
end
|
288
288
|
|
289
|
+
# Public: Sets the Hash proxy options.
|
290
|
+
def proxy=(new_value)
|
291
|
+
@manual_proxy = true
|
292
|
+
@proxy = new_value ? ProxyOptions.from(new_value) : nil
|
293
|
+
end
|
294
|
+
|
289
295
|
def_delegators :url_prefix, :scheme, :scheme=, :host, :host=, :port, :port=
|
290
296
|
def_delegator :url_prefix, :path, :path_prefix
|
291
297
|
|
@@ -304,7 +310,7 @@ module Faraday
|
|
304
310
|
#
|
305
311
|
# conn.get("nigiri?page=2") # accesses https://sushi.com/api/nigiri
|
306
312
|
#
|
307
|
-
# Returns the parsed URI from
|
313
|
+
# Returns the parsed URI from the given input..
|
308
314
|
def url_prefix=(url, encoder = nil)
|
309
315
|
uri = @url_prefix = Utils.URI(url)
|
310
316
|
self.path_prefix = uri.path
|
@@ -358,7 +364,7 @@ module Faraday
|
|
358
364
|
#
|
359
365
|
# method - The Symbol HTTP method.
|
360
366
|
# url - The String or URI to access.
|
361
|
-
# body - The
|
367
|
+
# body - The request body that will eventually be converted to a string.
|
362
368
|
# headers - Hash of unencoded HTTP header key/value pairs.
|
363
369
|
#
|
364
370
|
# Returns a Faraday::Response.
|
@@ -367,7 +373,11 @@ module Faraday
|
|
367
373
|
raise ArgumentError, "unknown http method: #{method}"
|
368
374
|
end
|
369
375
|
|
376
|
+
# Resets temp_proxy
|
377
|
+
@temp_proxy = proxy_for_request(url)
|
378
|
+
|
370
379
|
request = build_request(method) do |req|
|
380
|
+
req.options = req.options.merge(:proxy => @temp_proxy)
|
371
381
|
req.url(url) if url
|
372
382
|
req.headers.update(headers) if headers
|
373
383
|
req.body = body if body
|
@@ -384,7 +394,7 @@ module Faraday
|
|
384
394
|
Request.create(method) do |req|
|
385
395
|
req.params = self.params.dup
|
386
396
|
req.headers = self.headers.dup
|
387
|
-
req.options = self.options
|
397
|
+
req.options = self.options
|
388
398
|
yield(req) if block_given?
|
389
399
|
end
|
390
400
|
end
|
@@ -433,5 +443,42 @@ module Faraday
|
|
433
443
|
header(*args)
|
434
444
|
headers[Faraday::Request::Authorization::KEY] = header
|
435
445
|
end
|
446
|
+
|
447
|
+
def proxy_from_env(url)
|
448
|
+
return if Faraday.ignore_env_proxy
|
449
|
+
uri = nil
|
450
|
+
if URI.parse('').respond_to?(:find_proxy)
|
451
|
+
case url
|
452
|
+
when String
|
453
|
+
uri = Utils.URI(url)
|
454
|
+
uri = URI.parse("#{uri.scheme}://#{uri.hostname}").find_proxy
|
455
|
+
when URI
|
456
|
+
uri = url.find_proxy
|
457
|
+
when nil
|
458
|
+
uri = find_default_proxy
|
459
|
+
end
|
460
|
+
else
|
461
|
+
warn 'no_proxy is unsupported' if ENV['no_proxy'] || ENV['NO_PROXY']
|
462
|
+
uri = find_default_proxy
|
463
|
+
end
|
464
|
+
ProxyOptions.from(uri) if uri
|
465
|
+
end
|
466
|
+
|
467
|
+
def find_default_proxy
|
468
|
+
uri = ENV['http_proxy']
|
469
|
+
if uri && !uri.empty?
|
470
|
+
uri = 'http://' + uri if uri !~ /^http/i
|
471
|
+
uri
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
def proxy_for_request(url)
|
476
|
+
return self.proxy if @manual_proxy
|
477
|
+
if url && Utils.URI(url).absolute?
|
478
|
+
proxy_from_env(url)
|
479
|
+
else
|
480
|
+
self.proxy
|
481
|
+
end
|
482
|
+
end
|
436
483
|
end
|
437
484
|
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# @param new_klass [Class] new Klass to use
|
5
|
+
#
|
6
|
+
# @return [Class] A modified version of new_klass that warns on
|
7
|
+
# usage about deprecation.
|
8
|
+
# @see Faraday::Deprecate
|
9
|
+
module DeprecatedClass
|
10
|
+
def self.proxy_class(origclass, ver = '1.0')
|
11
|
+
proxy = Class.new(origclass) do
|
12
|
+
const_set("ORIG_CLASS", origclass)
|
13
|
+
|
14
|
+
class << self
|
15
|
+
extend Faraday::Deprecate
|
16
|
+
|
17
|
+
def ===(other)
|
18
|
+
(superclass == const_get("ORIG_CLASS") && other.is_a?(superclass)) || super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
proxy.singleton_class.send(:deprecate, :new, "#{origclass}.new", ver)
|
23
|
+
proxy.singleton_class.send(:deprecate, :inherited, origclass.name, ver)
|
24
|
+
proxy
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Deprecation using semver instead of date, based on Gem::Deprecate
|
29
|
+
# Provides a single method +deprecate+ to be used to declare when
|
30
|
+
# something is going away.
|
31
|
+
#
|
32
|
+
# class Legacy
|
33
|
+
# def self.klass_method
|
34
|
+
# # ...
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# def instance_method
|
38
|
+
# # ...
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# extend Faraday::Deprecate
|
42
|
+
# deprecate :instance_method, "X.z", '1.0'
|
43
|
+
#
|
44
|
+
# class << self
|
45
|
+
# extend Faraday::Deprecate
|
46
|
+
# deprecate :klass_method, :none, '1.0'
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
module Deprecate
|
50
|
+
def self.skip # :nodoc:
|
51
|
+
@skip ||= begin
|
52
|
+
case ENV['FARADAY_DEPRECATE'].to_s.downcase
|
53
|
+
when '1', 'warn' then :warn
|
54
|
+
else :skip
|
55
|
+
end
|
56
|
+
end
|
57
|
+
@skip == :skip
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.skip=(value) # :nodoc:
|
61
|
+
@skip = value ? :skip : :warn
|
62
|
+
end
|
63
|
+
|
64
|
+
# Temporarily turn off warnings. Intended for tests only.
|
65
|
+
def skip_during
|
66
|
+
original = Faraday::Deprecate.skip
|
67
|
+
Faraday::Deprecate.skip, = true
|
68
|
+
yield
|
69
|
+
ensure
|
70
|
+
Faraday::Deprecate.skip = original
|
71
|
+
end
|
72
|
+
|
73
|
+
# Simple deprecation method that deprecates +name+ by wrapping it up
|
74
|
+
# in a dummy method. It warns on each call to the dummy method
|
75
|
+
# telling the user of +repl+ (unless +repl+ is :none) and the
|
76
|
+
# semver that it is planned to go away.
|
77
|
+
# @param name [Symbol] the method symbol to deprecate
|
78
|
+
# @param repl [#to_s, :none] the replacement to use, when `:none` it will
|
79
|
+
# alert the user that no replacemtent is present.
|
80
|
+
# @param ver [String] the semver the method will be removed.
|
81
|
+
def deprecate(name, repl, ver)
|
82
|
+
class_eval do
|
83
|
+
gem_ver = Gem::Version.new(ver)
|
84
|
+
old = "_deprecated_#{name}"
|
85
|
+
alias_method old, name
|
86
|
+
define_method name do |*args, &block|
|
87
|
+
mod = is_a? Module
|
88
|
+
target = mod ? "#{self}." : "#{self.class}#"
|
89
|
+
target_message = if name == :inherited
|
90
|
+
"Inheriting #{self}"
|
91
|
+
else
|
92
|
+
"#{target}#{name}"
|
93
|
+
end
|
94
|
+
|
95
|
+
msg = [
|
96
|
+
"NOTE: #{target_message} is deprecated",
|
97
|
+
repl == :none ? ' with no replacement' : "; use #{repl} instead. ",
|
98
|
+
"It will be removed in or after version #{gem_ver}",
|
99
|
+
"\n#{target}#{name} called from #{Gem.location_of_caller.join(':')}"
|
100
|
+
]
|
101
|
+
warn "#{msg.join}." unless Faraday::Deprecate.skip
|
102
|
+
send old, *args, &block
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
module_function :deprecate, :skip_during
|
108
|
+
end
|
109
|
+
end
|
data/lib/faraday/error.rb
CHANGED
@@ -1,23 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday/deprecate'
|
4
|
+
|
5
|
+
# Faraday namespace.
|
1
6
|
module Faraday
|
2
|
-
|
3
|
-
class
|
7
|
+
# Faraday error base class.
|
8
|
+
class Error < StandardError
|
9
|
+
attr_reader :response, :wrapped_exception
|
4
10
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@wrapped_exception = nil
|
10
|
-
@response = response
|
11
|
-
|
12
|
-
if ex.respond_to?(:backtrace)
|
13
|
-
super(ex.message)
|
14
|
-
@wrapped_exception = ex
|
15
|
-
elsif ex.respond_to?(:each_key)
|
16
|
-
super("the server responded with status #{ex[:status]}")
|
17
|
-
@response = ex
|
18
|
-
else
|
19
|
-
super(ex.to_s)
|
20
|
-
end
|
11
|
+
def initialize(exc, response = nil)
|
12
|
+
@wrapped_exception = nil unless defined?(@wrapped_exception)
|
13
|
+
@response = nil unless defined?(@response)
|
14
|
+
super(exc_msg_and_response!(exc, response))
|
21
15
|
end
|
22
16
|
|
23
17
|
def backtrace
|
@@ -29,25 +23,136 @@ module Faraday
|
|
29
23
|
end
|
30
24
|
|
31
25
|
def inspect
|
32
|
-
|
26
|
+
inner = ''
|
27
|
+
inner += " wrapped=#{@wrapped_exception.inspect}" if @wrapped_exception
|
28
|
+
inner += " response=#{@response.inspect}" if @response
|
29
|
+
inner += " #{super}" if inner.empty?
|
30
|
+
%(#<#{self.class}#{inner}>)
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
# Pulls out potential parent exception and response hash, storing them in
|
36
|
+
# instance variables.
|
37
|
+
# exc - Either an Exception, a string message, or a response hash.
|
38
|
+
# response - Hash
|
39
|
+
# :status - Optional integer HTTP response status
|
40
|
+
# :headers - String key/value hash of HTTP response header
|
41
|
+
# values.
|
42
|
+
# :body - Optional string HTTP response body.
|
43
|
+
#
|
44
|
+
# If a subclass has to call this, then it should pass a string message
|
45
|
+
# to `super`. See NilStatusError.
|
46
|
+
def exc_msg_and_response!(exc, response = nil)
|
47
|
+
if @response.nil? && @wrapped_exception.nil?
|
48
|
+
@wrapped_exception, msg, @response = exc_msg_and_response(exc, response)
|
49
|
+
return msg
|
50
|
+
end
|
51
|
+
|
52
|
+
exc.to_s
|
53
|
+
end
|
54
|
+
|
55
|
+
# Pulls out potential parent exception and response hash.
|
56
|
+
def exc_msg_and_response(exc, response = nil)
|
57
|
+
return [exc, exc.message, response] if exc.respond_to?(:backtrace)
|
58
|
+
|
59
|
+
return [nil, "the server responded with status #{exc[:status]}", exc] \
|
60
|
+
if exc.respond_to?(:each_key)
|
61
|
+
|
62
|
+
[nil, exc.to_s, response]
|
33
63
|
end
|
34
64
|
end
|
35
65
|
|
36
|
-
class
|
37
|
-
class
|
38
|
-
|
66
|
+
# Faraday client error class. Represents 4xx status responses.
|
67
|
+
class ClientError < Error
|
68
|
+
end
|
69
|
+
|
70
|
+
# Raised by Faraday::Response::RaiseError in case of a 400 response.
|
71
|
+
class BadRequestError < ClientError
|
72
|
+
end
|
73
|
+
|
74
|
+
# Raised by Faraday::Response::RaiseError in case of a 401 response.
|
75
|
+
class UnauthorizedError < ClientError
|
76
|
+
end
|
77
|
+
|
78
|
+
# Raised by Faraday::Response::RaiseError in case of a 403 response.
|
79
|
+
class ForbiddenError < ClientError
|
80
|
+
end
|
81
|
+
|
82
|
+
# Raised by Faraday::Response::RaiseError in case of a 404 response.
|
83
|
+
class ResourceNotFound < ClientError
|
84
|
+
end
|
85
|
+
|
86
|
+
# Raised by Faraday::Response::RaiseError in case of a 407 response.
|
87
|
+
class ProxyAuthError < ClientError
|
88
|
+
end
|
89
|
+
|
90
|
+
# Raised by Faraday::Response::RaiseError in case of a 409 response.
|
91
|
+
class ConflictError < ClientError
|
92
|
+
end
|
93
|
+
|
94
|
+
# Raised by Faraday::Response::RaiseError in case of a 422 response.
|
95
|
+
class UnprocessableEntityError < ClientError
|
96
|
+
end
|
97
|
+
|
98
|
+
# Faraday server error class. Represents 5xx status responses.
|
99
|
+
class ServerError < Error
|
100
|
+
end
|
39
101
|
|
102
|
+
# A unified client error for timeouts.
|
40
103
|
class TimeoutError < ClientError
|
41
|
-
def initialize(
|
42
|
-
super(
|
104
|
+
def initialize(exc = 'timeout', response = nil)
|
105
|
+
super(exc, response)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Raised by Faraday::Response::RaiseError in case of a nil status in response.
|
110
|
+
class NilStatusError < ServerError
|
111
|
+
def initialize(exc, response = nil)
|
112
|
+
exc_msg_and_response!(exc, response)
|
113
|
+
@response = unwrap_resp!(@response)
|
114
|
+
super('http status could not be derived from the server response')
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
extend Faraday::Deprecate
|
120
|
+
|
121
|
+
def unwrap_resp(resp)
|
122
|
+
if inner = (resp.keys.size == 1 && resp[:response])
|
123
|
+
return unwrap_resp(inner)
|
124
|
+
end
|
125
|
+
|
126
|
+
resp
|
43
127
|
end
|
128
|
+
|
129
|
+
alias_method :unwrap_resp!, :unwrap_resp
|
130
|
+
deprecate('unwrap_resp', nil, '1.0')
|
44
131
|
end
|
45
132
|
|
133
|
+
# A unified error for failed connections.
|
134
|
+
class ConnectionFailed < ClientError
|
135
|
+
end
|
136
|
+
|
137
|
+
# A unified client error for SSL errors.
|
46
138
|
class SSLError < ClientError
|
47
139
|
end
|
48
140
|
|
49
|
-
|
50
|
-
|
51
|
-
|
141
|
+
# Raised by FaradayMiddleware::ResponseMiddleware
|
142
|
+
class ParsingError < ClientError
|
143
|
+
end
|
144
|
+
|
145
|
+
# Exception used to control the Retry middleware.
|
146
|
+
#
|
147
|
+
# @see Faraday::Request::Retry
|
148
|
+
class RetriableResponse < ClientError
|
149
|
+
end
|
150
|
+
|
151
|
+
[:ClientError, :ConnectionFailed, :ResourceNotFound,
|
152
|
+
:ParsingError, :TimeoutError, :SSLError, :RetriableResponse].each do |const|
|
153
|
+
Error.const_set(
|
154
|
+
const,
|
155
|
+
DeprecatedClass.proxy_class(Faraday.const_get(const))
|
156
|
+
)
|
52
157
|
end
|
53
158
|
end
|