faraday 0.9.0.rc5 → 0.9.0.rc6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +6 -5
- data/README.md +0 -22
- data/faraday.gemspec +2 -2
- data/lib/faraday.rb +6 -2
- data/lib/faraday/adapter/em_http.rb +34 -14
- data/lib/faraday/adapter/em_http_ssl_patch.rb +56 -0
- data/lib/faraday/adapter/em_synchrony.rb +21 -20
- data/lib/faraday/adapter/excon.rb +16 -0
- data/lib/faraday/adapter/httpclient.rb +14 -0
- data/lib/faraday/adapter/net_http.rb +6 -2
- data/lib/faraday/adapter/net_http_persistent.rb +15 -3
- data/lib/faraday/adapter/patron.rb +13 -11
- data/lib/faraday/adapter/typhoeus.rb +11 -0
- data/lib/faraday/autoload.rb +2 -4
- data/lib/faraday/connection.rb +30 -3
- data/lib/faraday/error.rb +4 -1
- data/lib/faraday/options.rb +117 -23
- data/lib/faraday/request/instrumentation.rb +1 -3
- data/lib/faraday/request/multipart.rb +1 -1
- data/lib/faraday/request/retry.rb +38 -9
- data/lib/faraday/response.rb +1 -2
- data/lib/faraday/response/raise_error.rb +3 -0
- data/lib/faraday/utils.rb +10 -4
- data/script/proxy-server +42 -0
- data/script/server +1 -3
- data/script/test +35 -7
- data/test/adapters/excon_test.rb +4 -0
- data/test/adapters/httpclient_test.rb +5 -0
- data/test/adapters/integration.rb +48 -2
- data/test/adapters/net_http_persistent_test.rb +10 -1
- data/test/adapters/patron_test.rb +3 -0
- data/test/adapters/rack_test.rb +5 -0
- data/test/adapters/typhoeus_test.rb +3 -13
- data/test/authentication_middleware_test.rb +6 -6
- data/test/connection_test.rb +123 -49
- data/test/env_test.rb +19 -1
- data/test/helper.rb +2 -4
- data/test/live_server.rb +4 -2
- data/test/middleware/instrumentation_test.rb +13 -0
- data/test/middleware/retry_test.rb +47 -0
- data/test/multibyte.txt +1 -0
- data/test/options_test.rb +93 -17
- data/test/request_middleware_test.rb +6 -6
- data/test/utils_test.rb +34 -13
- metadata +69 -44
data/Gemfile
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gem 'ffi-ncurses', '~> 0.3', :platforms => :jruby
|
4
|
-
gem 'jruby-openssl', '~> 0.
|
4
|
+
gem 'jruby-openssl', '~> 0.8.8', :platforms => :jruby
|
5
5
|
gem 'rake'
|
6
6
|
|
7
7
|
group :test do
|
8
8
|
gem 'coveralls', :require => false
|
9
|
-
gem 'em-http-request', '>= 1.
|
10
|
-
gem 'em-synchrony', '>= 1.0', :require => ['em-synchrony', 'em-synchrony/em-http']
|
11
|
-
gem 'excon', '>= 0.
|
9
|
+
gem 'em-http-request', '>= 1.1', :require => 'em-http'
|
10
|
+
gem 'em-synchrony', '>= 1.0.3', :require => ['em-synchrony', 'em-synchrony/em-http']
|
11
|
+
gem 'excon', ['>= 0.25.3', '< 0.27.3']
|
12
12
|
gem 'httpclient', '>= 2.2'
|
13
13
|
gem 'leftright', '>= 0.9', :require => false
|
14
|
-
gem '
|
14
|
+
gem 'mime-types', '~> 1.25', :platforms => :ruby_18
|
15
|
+
gem 'minitest', '~> 5.0.5'
|
15
16
|
gem 'net-http-persistent', '>= 2.5', :require => false
|
16
17
|
gem 'patron', '>= 0.4.2', :platforms => :ruby
|
17
18
|
gem 'rack-test', '>= 0.6', :require => 'rack/test'
|
data/README.md
CHANGED
@@ -24,17 +24,6 @@ conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
|
|
24
24
|
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
|
25
25
|
end
|
26
26
|
|
27
|
-
# set proxy with string
|
28
|
-
conn.options.proxy = "http://user:password@example.org/"
|
29
|
-
|
30
|
-
# set proxy with hash
|
31
|
-
conn.options.proxy = { :uri => 'http://user:passwordexample.org' }
|
32
|
-
|
33
|
-
# specify proxy user/pass
|
34
|
-
conn.options.proxy = { :uri => 'http://user:pass.org',
|
35
|
-
:user => 'user',
|
36
|
-
:password => 'pass' }
|
37
|
-
|
38
27
|
## GET ##
|
39
28
|
|
40
29
|
response = conn.get '/nigiri/sake.json' # GET http://sushi.com/nigiri/sake.json
|
@@ -64,17 +53,6 @@ conn.get do |req|
|
|
64
53
|
req.url '/search'
|
65
54
|
req.options.timeout = 5 # open/read timeout in seconds
|
66
55
|
req.options.open_timeout = 2 # connection open timeout in seconds
|
67
|
-
|
68
|
-
# set proxy with string
|
69
|
-
req.options.proxy = "http://user:password@example.org/"
|
70
|
-
|
71
|
-
# set proxy with hash
|
72
|
-
req.options.proxy = { :uri => 'http://user:passwordexample.org' }
|
73
|
-
|
74
|
-
# specify proxy user/pass
|
75
|
-
req.options.proxy = { :uri => 'http://user:pass.org',
|
76
|
-
:user => 'user',
|
77
|
-
:password => 'pass' }
|
78
56
|
end
|
79
57
|
```
|
80
58
|
|
data/faraday.gemspec
CHANGED
@@ -17,13 +17,13 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.homepage = 'https://github.com/lostisland/faraday'
|
18
18
|
spec.licenses = ['MIT']
|
19
19
|
|
20
|
-
spec.add_dependency 'multipart-post', '~> 1.
|
20
|
+
spec.add_dependency 'multipart-post', '~> 1.2.0'
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.0'
|
22
22
|
|
23
23
|
spec.files = %w(.document CHANGELOG.md CONTRIBUTING.md Gemfile LICENSE.md README.md Rakefile)
|
24
24
|
spec.files << "#{lib}.gemspec"
|
25
25
|
spec.files += Dir.glob("lib/**/*.rb")
|
26
|
-
spec.files += Dir.glob("test/**/*.rb")
|
26
|
+
spec.files += Dir.glob("test/**/*.{rb,txt}")
|
27
27
|
spec.files += Dir.glob("script/*")
|
28
28
|
|
29
29
|
dev_null = File.exist?('/dev/null') ? '/dev/null' : 'NUL'
|
data/lib/faraday.rb
CHANGED
@@ -14,7 +14,7 @@ require 'forwardable'
|
|
14
14
|
# conn.get '/'
|
15
15
|
#
|
16
16
|
module Faraday
|
17
|
-
VERSION = "0.9.0.
|
17
|
+
VERSION = "0.9.0.rc6"
|
18
18
|
|
19
19
|
class << self
|
20
20
|
# Public: Gets or sets the root path that Faraday is being loaded from.
|
@@ -26,7 +26,7 @@ module Faraday
|
|
26
26
|
|
27
27
|
# Public: Gets or sets the Symbol key identifying a default Adapter to use
|
28
28
|
# for the default Faraday::Connection.
|
29
|
-
|
29
|
+
attr_reader :default_adapter
|
30
30
|
|
31
31
|
# Public: Sets the default Faraday::Connection for simple scripts that
|
32
32
|
# access the Faraday constant directly.
|
@@ -238,6 +238,10 @@ module Faraday
|
|
238
238
|
|
239
239
|
require_libs "utils", "options", "connection", "rack_builder", "parameters",
|
240
240
|
"middleware", "adapter", "request", "response", "upload_io", "error"
|
241
|
+
|
242
|
+
if !ENV["FARADAY_NO_AUTOLOAD"]
|
243
|
+
require_lib 'autoload'
|
244
|
+
end
|
241
245
|
end
|
242
246
|
|
243
247
|
# not pulling in active-support JUST for this method. And I love this method.
|
@@ -7,10 +7,10 @@ module Faraday
|
|
7
7
|
module Options
|
8
8
|
def connection_config(env)
|
9
9
|
options = {}
|
10
|
-
configure_ssl(options, env)
|
11
10
|
configure_proxy(options, env)
|
12
11
|
configure_timeout(options, env)
|
13
12
|
configure_socket(options, env)
|
13
|
+
configure_ssl(options, env)
|
14
14
|
options
|
15
15
|
end
|
16
16
|
|
@@ -22,9 +22,6 @@ module Faraday
|
|
22
22
|
# :file => 'path/to/file', # stream data off disk
|
23
23
|
}
|
24
24
|
configure_compression(options, env)
|
25
|
-
# configure_proxy_auth
|
26
|
-
# :proxy => {:authorization => [user, pass]}
|
27
|
-
# proxy[:username] && proxy[:password]
|
28
25
|
options
|
29
26
|
end
|
30
27
|
|
@@ -33,20 +30,12 @@ module Faraday
|
|
33
30
|
body.respond_to?(:read) ? body.read : body
|
34
31
|
end
|
35
32
|
|
36
|
-
def configure_ssl(options, env)
|
37
|
-
if ssl = env[:ssl]
|
38
|
-
# :ssl => {
|
39
|
-
# :private_key_file => '/tmp/server.key',
|
40
|
-
# :cert_chain_file => '/tmp/server.crt',
|
41
|
-
# :verify_peer => false
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
33
|
def configure_proxy(options, env)
|
46
34
|
if proxy = request_options(env)[:proxy]
|
47
35
|
options[:proxy] = {
|
48
36
|
:host => proxy[:uri].host,
|
49
|
-
:port => proxy[:uri].port
|
37
|
+
:port => proxy[:uri].port,
|
38
|
+
:authorization => [proxy[:user], proxy[:password]]
|
50
39
|
}
|
51
40
|
end
|
52
41
|
end
|
@@ -60,6 +49,15 @@ module Faraday
|
|
60
49
|
end
|
61
50
|
end
|
62
51
|
|
52
|
+
def configure_ssl(options, env)
|
53
|
+
if env[:url].scheme == 'https' && env[:ssl]
|
54
|
+
options[:ssl] = {
|
55
|
+
:cert_chain_file => env[:ssl][:ca_file],
|
56
|
+
:verify_peer => env[:ssl].fetch(:verify, true)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
63
61
|
def configure_timeout(options, env)
|
64
62
|
timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
|
65
63
|
options[:connect_timeout] = options[:inactivity_timeout] = timeout
|
@@ -124,6 +122,18 @@ module Faraday
|
|
124
122
|
}
|
125
123
|
end
|
126
124
|
end
|
125
|
+
rescue EventMachine::Connectify::CONNECTError => err
|
126
|
+
if err.message.include?("Proxy Authentication Required")
|
127
|
+
raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
128
|
+
else
|
129
|
+
raise Error::ConnectionFailed, err
|
130
|
+
end
|
131
|
+
rescue => err
|
132
|
+
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
133
|
+
raise Faraday::SSLError, err
|
134
|
+
else
|
135
|
+
raise
|
136
|
+
end
|
127
137
|
end
|
128
138
|
|
129
139
|
# TODO: reuse the connection to support pipelining
|
@@ -150,6 +160,8 @@ module Faraday
|
|
150
160
|
elsif msg == Errno::ECONNREFUSED
|
151
161
|
errklass = Faraday::Error::ConnectionFailed
|
152
162
|
msg = "connection refused"
|
163
|
+
elsif msg == "connection closed by server"
|
164
|
+
errklass = Faraday::Error::ConnectionFailed
|
153
165
|
end
|
154
166
|
raise errklass, msg
|
155
167
|
end
|
@@ -215,3 +227,11 @@ module Faraday
|
|
215
227
|
end
|
216
228
|
end
|
217
229
|
end
|
230
|
+
|
231
|
+
begin
|
232
|
+
require 'openssl'
|
233
|
+
rescue LoadError
|
234
|
+
warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
|
235
|
+
else
|
236
|
+
require 'faraday/adapter/em_http_ssl_patch'
|
237
|
+
end if Faraday::Adapter::EMHttp.loaded?
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'em-http'
|
3
|
+
|
4
|
+
module EmHttpSslPatch
|
5
|
+
def ssl_verify_peer(cert_string)
|
6
|
+
cert = nil
|
7
|
+
begin
|
8
|
+
cert = OpenSSL::X509::Certificate.new(cert_string)
|
9
|
+
rescue OpenSSL::X509::CertificateError
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
|
13
|
+
@last_seen_cert = cert
|
14
|
+
|
15
|
+
if certificate_store.verify(@last_seen_cert)
|
16
|
+
begin
|
17
|
+
certificate_store.add_cert(@last_seen_cert)
|
18
|
+
rescue OpenSSL::X509::StoreError => e
|
19
|
+
raise e unless e.message == 'cert already in hash table'
|
20
|
+
end
|
21
|
+
true
|
22
|
+
else
|
23
|
+
raise OpenSSL::SSL::SSLError.new(%(unable to verify the server certificate for "#{host}"))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def ssl_handshake_completed
|
28
|
+
return true unless verify_peer?
|
29
|
+
|
30
|
+
unless OpenSSL::SSL.verify_certificate_identity(@last_seen_cert, host)
|
31
|
+
raise OpenSSL::SSL::SSLError.new(%(host "#{host}" does not match the server certificate))
|
32
|
+
else
|
33
|
+
true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def verify_peer?
|
38
|
+
parent.connopts.tls[:verify_peer]
|
39
|
+
end
|
40
|
+
|
41
|
+
def host
|
42
|
+
parent.connopts.host
|
43
|
+
end
|
44
|
+
|
45
|
+
def certificate_store
|
46
|
+
@certificate_store ||= begin
|
47
|
+
store = OpenSSL::X509::Store.new
|
48
|
+
store.set_default_paths
|
49
|
+
ca_file = parent.connopts.tls[:cert_chain_file]
|
50
|
+
store.add_file(ca_file) if ca_file
|
51
|
+
store
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
EventMachine::HttpStubConnection.send(:include, EmHttpSslPatch)
|
@@ -52,6 +52,8 @@ module Faraday
|
|
52
52
|
client = block.call
|
53
53
|
end
|
54
54
|
|
55
|
+
raise client.error if client.error
|
56
|
+
|
55
57
|
save_response(env, client.response_header.status, client.response) do |resp_headers|
|
56
58
|
client.response_header.each do |name, value|
|
57
59
|
resp_headers[name.to_sym] = value
|
@@ -62,6 +64,18 @@ module Faraday
|
|
62
64
|
@app.call env
|
63
65
|
rescue Errno::ECONNREFUSED
|
64
66
|
raise Error::ConnectionFailed, $!
|
67
|
+
rescue EventMachine::Connectify::CONNECTError => err
|
68
|
+
if err.message.include?("Proxy Authentication Required")
|
69
|
+
raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
70
|
+
else
|
71
|
+
raise Error::ConnectionFailed, err
|
72
|
+
end
|
73
|
+
rescue => err
|
74
|
+
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
75
|
+
raise Faraday::SSLError, err
|
76
|
+
else
|
77
|
+
raise
|
78
|
+
end
|
65
79
|
end
|
66
80
|
end
|
67
81
|
end
|
@@ -69,23 +83,10 @@ end
|
|
69
83
|
|
70
84
|
require 'faraday/adapter/em_synchrony/parallel_manager'
|
71
85
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
f = Fiber.current
|
80
|
-
conn = setup_request(:#{type}, options, &blk)
|
81
|
-
if conn.error.nil?
|
82
|
-
conn.callback { f.resume(conn) }
|
83
|
-
conn.errback { f.resume(conn) }
|
84
|
-
Fiber.yield
|
85
|
-
else
|
86
|
-
conn
|
87
|
-
end
|
88
|
-
end
|
89
|
-
]
|
90
|
-
end
|
91
|
-
end
|
86
|
+
begin
|
87
|
+
require 'openssl'
|
88
|
+
rescue LoadError
|
89
|
+
warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
|
90
|
+
else
|
91
|
+
require 'faraday/adapter/em_http_ssl_patch'
|
92
|
+
end if Faraday::Adapter::EMSynchrony.loaded?
|
@@ -16,6 +16,10 @@ module Faraday
|
|
16
16
|
opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true)
|
17
17
|
opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path]
|
18
18
|
opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file]
|
19
|
+
opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert]
|
20
|
+
opts[:client_key] = ssl[:client_key] if ssl[:client_key]
|
21
|
+
opts[:certificate] = ssl[:certificate] if ssl[:certificate]
|
22
|
+
opts[:private_key] = ssl[:private_key] if ssl[:private_key]
|
19
23
|
|
20
24
|
# https://github.com/geemus/excon/issues/106
|
21
25
|
# https://github.com/jruby/jruby-ossl/issues/19
|
@@ -33,6 +37,16 @@ module Faraday
|
|
33
37
|
opts[:connect_timeout] = req[:open_timeout]
|
34
38
|
opts[:write_timeout] = req[:open_timeout]
|
35
39
|
end
|
40
|
+
|
41
|
+
if req[:proxy]
|
42
|
+
opts[:proxy] = {
|
43
|
+
:host => req[:proxy][:uri].host,
|
44
|
+
:port => req[:proxy][:uri].port,
|
45
|
+
:scheme => req[:proxy][:uri].scheme,
|
46
|
+
:user => req[:proxy][:user],
|
47
|
+
:password => req[:proxy][:password]
|
48
|
+
}
|
49
|
+
end
|
36
50
|
end
|
37
51
|
|
38
52
|
conn = ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
|
@@ -48,6 +62,8 @@ module Faraday
|
|
48
62
|
rescue ::Excon::Errors::SocketError => err
|
49
63
|
if err.message =~ /\btimeout\b/
|
50
64
|
raise Error::TimeoutError, err
|
65
|
+
elsif err.message =~ /\bcertificate\b/
|
66
|
+
raise Faraday::SSLError, err
|
51
67
|
else
|
52
68
|
raise Error::ConnectionFailed, err
|
53
69
|
end
|
@@ -39,6 +39,20 @@ module Faraday
|
|
39
39
|
@app.call env
|
40
40
|
rescue ::HTTPClient::TimeoutError
|
41
41
|
raise Faraday::Error::TimeoutError, $!
|
42
|
+
rescue ::HTTPClient::BadResponseError => err
|
43
|
+
if err.message.include?('status 407')
|
44
|
+
raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
45
|
+
else
|
46
|
+
raise Faraday::Error::ClientError, $!
|
47
|
+
end
|
48
|
+
rescue Errno::ECONNREFUSED, EOFError
|
49
|
+
raise Faraday::Error::ConnectionFailed, $!
|
50
|
+
rescue => err
|
51
|
+
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
52
|
+
raise Faraday::SSLError, err
|
53
|
+
else
|
54
|
+
raise
|
55
|
+
end
|
42
56
|
end
|
43
57
|
|
44
58
|
def configure_socket(bind)
|
@@ -36,8 +36,12 @@ module Faraday
|
|
36
36
|
|
37
37
|
begin
|
38
38
|
http_response = perform_request(http, env)
|
39
|
-
rescue *NET_HTTP_EXCEPTIONS
|
40
|
-
|
39
|
+
rescue *NET_HTTP_EXCEPTIONS => err
|
40
|
+
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
41
|
+
raise Faraday::SSLError, err
|
42
|
+
else
|
43
|
+
raise Error::ConnectionFailed, err
|
44
|
+
end
|
41
45
|
end
|
42
46
|
|
43
47
|
save_response(env, http_response.code.to_i, http_response.body || '') do |response_headers|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
require
|
1
|
+
# Rely on autoloading instead of explicit require; helps avoid the "already
|
2
|
+
# initialized constant" warning on Ruby 1.8.7 when NetHttp is refereced below.
|
3
|
+
# require 'faraday/adapter/net_http'
|
2
4
|
|
3
5
|
module Faraday
|
4
6
|
class Adapter
|
@@ -7,8 +9,16 @@ module Faraday
|
|
7
9
|
dependency 'net/http/persistent'
|
8
10
|
|
9
11
|
def net_http_connection(env)
|
10
|
-
|
11
|
-
|
12
|
+
if proxy = env[:request][:proxy]
|
13
|
+
proxy_uri = ::URI::HTTP === proxy[:uri] ? proxy[:uri].dup : ::URI.parse(proxy[:uri].to_s)
|
14
|
+
proxy_uri.user = proxy_uri.password = nil
|
15
|
+
# awful patch for net-http-persistent 2.8 not unescaping user/password
|
16
|
+
(class << proxy_uri; self; end).class_eval do
|
17
|
+
define_method(:user) { proxy[:user] }
|
18
|
+
define_method(:password) { proxy[:password] }
|
19
|
+
end if proxy[:user]
|
20
|
+
end
|
21
|
+
Net::HTTP::Persistent.new 'Faraday', proxy_uri
|
12
22
|
end
|
13
23
|
|
14
24
|
def perform_request(http, env)
|
@@ -16,6 +26,8 @@ module Faraday
|
|
16
26
|
rescue Net::HTTP::Persistent::Error => error
|
17
27
|
if error.message.include? 'Timeout'
|
18
28
|
raise Faraday::Error::TimeoutError, error
|
29
|
+
elsif error.message.include? 'connection refused'
|
30
|
+
raise Faraday::Error::ConnectionFailed, error
|
19
31
|
else
|
20
32
|
raise
|
21
33
|
end
|
@@ -5,7 +5,7 @@ module Faraday
|
|
5
5
|
|
6
6
|
def initialize(app, &block)
|
7
7
|
super(app)
|
8
|
-
@block = block
|
8
|
+
@block = block
|
9
9
|
end
|
10
10
|
|
11
11
|
def call(env)
|
@@ -19,19 +19,19 @@ module Faraday
|
|
19
19
|
if req = env[:request]
|
20
20
|
session.timeout = session.connect_timeout = req[:timeout] if req[:timeout]
|
21
21
|
session.connect_timeout = req[:open_timeout] if req[:open_timeout]
|
22
|
-
|
22
|
+
|
23
23
|
if proxy = req[:proxy]
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
proxy_uri = proxy[:uri].dup
|
25
|
+
proxy_uri.user = proxy[:user] && Utils.escape(proxy[:user]).gsub('+', '%20')
|
26
|
+
proxy_uri.password = proxy[:password] && Utils.escape(proxy[:password]).gsub('+', '%20')
|
27
|
+
session.proxy = proxy_uri.to_s
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
response = begin
|
32
32
|
data = env[:body] ? env[:body].to_s : nil
|
33
33
|
session.request(env[:method], env[:url].to_s, env[:request_headers], :data => data)
|
34
|
-
rescue Errno::ECONNREFUSED
|
34
|
+
rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed
|
35
35
|
raise Error::ConnectionFailed, $!
|
36
36
|
end
|
37
37
|
|
@@ -40,6 +40,12 @@ module Faraday
|
|
40
40
|
@app.call env
|
41
41
|
rescue ::Patron::TimeoutError => err
|
42
42
|
raise Faraday::Error::TimeoutError, err
|
43
|
+
rescue ::Patron::Error => err
|
44
|
+
if err.message.include?("code 407")
|
45
|
+
raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
46
|
+
else
|
47
|
+
raise Error::ConnectionFailed, err
|
48
|
+
end
|
43
49
|
end
|
44
50
|
|
45
51
|
if loaded? && defined?(::Patron::Request::VALID_ACTIONS)
|
@@ -58,9 +64,5 @@ module Faraday
|
|
58
64
|
session
|
59
65
|
end
|
60
66
|
end
|
61
|
-
|
62
|
-
def prepend_proxy_auth_string(proxy, session)
|
63
|
-
session.proxy.insert(7, "#{proxy[:user]}:#{proxy[:password]}@")
|
64
|
-
end
|
65
67
|
end
|
66
68
|
end
|