faraday 0.9.1 → 0.17.4
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 +212 -0
- data/LICENSE.md +1 -1
- data/README.md +203 -28
- data/Rakefile +6 -64
- 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 +19 -5
- data/lib/faraday/adapter/excon.rb +13 -11
- data/lib/faraday/adapter/httpclient.rb +31 -9
- data/lib/faraday/adapter/net_http.rb +37 -14
- data/lib/faraday/adapter/net_http_persistent.rb +37 -17
- data/lib/faraday/adapter/patron.rb +44 -21
- 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 +72 -20
- data/lib/faraday/deprecate.rb +109 -0
- data/lib/faraday/error.rb +132 -27
- data/lib/faraday/options.rb +45 -22
- data/lib/faraday/parameters.rb +56 -39
- data/lib/faraday/rack_builder.rb +29 -4
- data/lib/faraday/request/authorization.rb +1 -2
- data/lib/faraday/request/multipart.rb +7 -2
- data/lib/faraday/request/retry.rb +84 -19
- data/lib/faraday/request.rb +22 -0
- data/lib/faraday/response/logger.rb +29 -8
- data/lib/faraday/response/raise_error.rb +7 -3
- data/lib/faraday/response.rb +9 -5
- data/lib/faraday/utils.rb +32 -3
- 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/em_http_test.rb +10 -0
- data/test/adapters/em_synchrony_test.rb +22 -10
- data/test/adapters/excon_test.rb +10 -0
- data/test/adapters/httpclient_test.rb +14 -1
- data/test/adapters/integration.rb +17 -8
- data/test/adapters/logger_test.rb +65 -11
- data/test/adapters/net_http_persistent_test.rb +96 -2
- data/test/adapters/net_http_test.rb +67 -2
- data/test/adapters/patron_test.rb +28 -8
- data/test/adapters/rack_test.rb +8 -1
- data/test/adapters/test_middleware_test.rb +46 -3
- data/test/adapters/typhoeus_test.rb +19 -9
- data/test/composite_read_io_test.rb +16 -18
- data/test/connection_test.rb +294 -78
- data/test/env_test.rb +55 -5
- data/test/helper.rb +11 -17
- data/test/middleware/retry_test.rb +115 -10
- data/test/middleware_stack_test.rb +97 -10
- data/test/options_test.rb +97 -16
- data/test/parameters_test.rb +94 -1
- data/test/request_middleware_test.rb +24 -40
- data/test/response_middleware_test.rb +4 -4
- data/test/utils_test.rb +40 -0
- metadata +21 -66
- data/.document +0 -6
- data/CONTRIBUTING.md +0 -36
- data/Gemfile +0 -25
- data/faraday.gemspec +0 -34
- 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
@@ -124,9 +124,9 @@ module Faraday
|
|
124
124
|
end
|
125
125
|
rescue EventMachine::Connectify::CONNECTError => err
|
126
126
|
if err.message.include?("Proxy Authentication Required")
|
127
|
-
raise
|
127
|
+
raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
128
128
|
else
|
129
|
-
raise
|
129
|
+
raise Faraday::ConnectionFailed, err
|
130
130
|
end
|
131
131
|
rescue => err
|
132
132
|
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
@@ -138,9 +138,11 @@ module Faraday
|
|
138
138
|
|
139
139
|
# TODO: reuse the connection to support pipelining
|
140
140
|
def perform_single_request(env)
|
141
|
-
req =
|
141
|
+
req = create_request(env)
|
142
142
|
req.setup_request(env[:method], request_config(env)).callback { |client|
|
143
|
-
|
143
|
+
status = client.response_header.status
|
144
|
+
reason = client.response_header.http_reason
|
145
|
+
save_response(env, status, client.response, nil, reason) do |resp_headers|
|
144
146
|
client.response_header.each do |name, value|
|
145
147
|
resp_headers[name.to_sym] = value
|
146
148
|
end
|
@@ -148,20 +150,24 @@ module Faraday
|
|
148
150
|
}
|
149
151
|
end
|
150
152
|
|
153
|
+
def create_request(env)
|
154
|
+
EventMachine::HttpRequest.new(env[:url], connection_config(env).merge(@connection_options))
|
155
|
+
end
|
156
|
+
|
151
157
|
def error_message(client)
|
152
158
|
client.error or "request failed"
|
153
159
|
end
|
154
160
|
|
155
161
|
def raise_error(msg)
|
156
|
-
errklass = Faraday::
|
162
|
+
errklass = Faraday::ClientError
|
157
163
|
if msg == Errno::ETIMEDOUT
|
158
|
-
errklass = Faraday::
|
164
|
+
errklass = Faraday::TimeoutError
|
159
165
|
msg = "request timed out"
|
160
166
|
elsif msg == Errno::ECONNREFUSED
|
161
|
-
errklass = Faraday::
|
167
|
+
errklass = Faraday::ConnectionFailed
|
162
168
|
msg = "connection refused"
|
163
169
|
elsif msg == "connection closed by server"
|
164
|
-
errklass = Faraday::
|
170
|
+
errklass = Faraday::ConnectionFailed
|
165
171
|
end
|
166
172
|
raise errklass, msg
|
167
173
|
end
|
@@ -187,11 +193,11 @@ module Faraday
|
|
187
193
|
|
188
194
|
def running?() @running end
|
189
195
|
|
190
|
-
def add
|
196
|
+
def add(&block)
|
191
197
|
if running?
|
192
198
|
perform_request { yield }
|
193
199
|
else
|
194
|
-
@registered_procs <<
|
200
|
+
@registered_procs << block
|
195
201
|
end
|
196
202
|
@num_registered += 1
|
197
203
|
end
|
@@ -205,7 +211,7 @@ module Faraday
|
|
205
211
|
end
|
206
212
|
end
|
207
213
|
if @errors.size > 0
|
208
|
-
raise Faraday::
|
214
|
+
raise Faraday::ClientError, @errors.first || "connection failed"
|
209
215
|
end
|
210
216
|
end
|
211
217
|
ensure
|
@@ -19,7 +19,7 @@ module Faraday
|
|
19
19
|
|
20
20
|
def call(env)
|
21
21
|
super
|
22
|
-
request =
|
22
|
+
request = create_request(env)
|
23
23
|
|
24
24
|
http_method = env[:method].to_s.downcase.to_sym
|
25
25
|
|
@@ -54,7 +54,9 @@ module Faraday
|
|
54
54
|
|
55
55
|
raise client.error if client.error
|
56
56
|
|
57
|
-
|
57
|
+
status = client.response_header.status
|
58
|
+
reason = client.response_header.http_reason
|
59
|
+
save_response(env, status, client.response, nil, reason) do |resp_headers|
|
58
60
|
client.response_header.each do |name, value|
|
59
61
|
resp_headers[name.to_sym] = value
|
60
62
|
end
|
@@ -63,12 +65,20 @@ module Faraday
|
|
63
65
|
|
64
66
|
@app.call env
|
65
67
|
rescue Errno::ECONNREFUSED
|
66
|
-
raise
|
68
|
+
raise Faraday::ConnectionFailed, $!
|
67
69
|
rescue EventMachine::Connectify::CONNECTError => err
|
68
70
|
if err.message.include?("Proxy Authentication Required")
|
69
|
-
raise
|
71
|
+
raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
70
72
|
else
|
71
|
-
raise
|
73
|
+
raise Faraday::ConnectionFailed, err
|
74
|
+
end
|
75
|
+
rescue Errno::ETIMEDOUT => err
|
76
|
+
raise Faraday::TimeoutError, err
|
77
|
+
rescue RuntimeError => err
|
78
|
+
if err.message == "connection closed by server"
|
79
|
+
raise Faraday::ConnectionFailed, err
|
80
|
+
else
|
81
|
+
raise
|
72
82
|
end
|
73
83
|
rescue => err
|
74
84
|
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
@@ -77,6 +87,10 @@ module Faraday
|
|
77
87
|
raise
|
78
88
|
end
|
79
89
|
end
|
90
|
+
|
91
|
+
def create_request(env)
|
92
|
+
EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env).merge(@connection_options))
|
93
|
+
end
|
80
94
|
end
|
81
95
|
end
|
82
96
|
end
|
@@ -3,11 +3,6 @@ module Faraday
|
|
3
3
|
class Excon < Faraday::Adapter
|
4
4
|
dependency 'excon'
|
5
5
|
|
6
|
-
def initialize(app, connection_options = {})
|
7
|
-
@connection_options = connection_options
|
8
|
-
super(app)
|
9
|
-
end
|
10
|
-
|
11
6
|
def call(env)
|
12
7
|
super
|
13
8
|
|
@@ -20,6 +15,9 @@ module Faraday
|
|
20
15
|
opts[:client_key] = ssl[:client_key] if ssl[:client_key]
|
21
16
|
opts[:certificate] = ssl[:certificate] if ssl[:certificate]
|
22
17
|
opts[:private_key] = ssl[:private_key] if ssl[:private_key]
|
18
|
+
opts[:ssl_version] = ssl[:version] if ssl[:version]
|
19
|
+
opts[:ssl_min_version] = ssl[:min_version] if ssl[:min_version]
|
20
|
+
opts[:ssl_max_version] = ssl[:max_version] if ssl[:max_version]
|
23
21
|
|
24
22
|
# https://github.com/geemus/excon/issues/106
|
25
23
|
# https://github.com/jruby/jruby-ossl/issues/19
|
@@ -35,12 +33,12 @@ module Faraday
|
|
35
33
|
|
36
34
|
if req[:open_timeout]
|
37
35
|
opts[:connect_timeout] = req[:open_timeout]
|
38
|
-
opts[:write_timeout] = req[:open_timeout]
|
39
36
|
end
|
40
37
|
|
41
38
|
if req[:proxy]
|
42
39
|
opts[:proxy] = {
|
43
40
|
:host => req[:proxy][:uri].host,
|
41
|
+
:hostname => req[:proxy][:uri].hostname,
|
44
42
|
:port => req[:proxy][:uri].port,
|
45
43
|
:scheme => req[:proxy][:uri].scheme,
|
46
44
|
:user => req[:proxy][:user],
|
@@ -49,26 +47,30 @@ module Faraday
|
|
49
47
|
end
|
50
48
|
end
|
51
49
|
|
52
|
-
conn =
|
50
|
+
conn = create_connection(env, opts)
|
53
51
|
|
54
52
|
resp = conn.request \
|
55
53
|
:method => env[:method].to_s.upcase,
|
56
54
|
:headers => env[:request_headers],
|
57
55
|
:body => read_body(env)
|
58
56
|
|
59
|
-
save_response(env, resp.status.to_i, resp.body, resp.headers)
|
57
|
+
save_response(env, resp.status.to_i, resp.body, resp.headers, resp.reason_phrase)
|
60
58
|
|
61
59
|
@app.call env
|
62
60
|
rescue ::Excon::Errors::SocketError => err
|
63
61
|
if err.message =~ /\btimeout\b/
|
64
|
-
raise
|
62
|
+
raise Faraday::TimeoutError, err
|
65
63
|
elsif err.message =~ /\bcertificate\b/
|
66
64
|
raise Faraday::SSLError, err
|
67
65
|
else
|
68
|
-
raise
|
66
|
+
raise Faraday::ConnectionFailed, err
|
69
67
|
end
|
70
68
|
rescue ::Excon::Errors::Timeout => err
|
71
|
-
raise
|
69
|
+
raise Faraday::TimeoutError, err
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_connection(env, opts)
|
73
|
+
::Excon.new(env[:url].to_s, opts.merge(@connection_options))
|
72
74
|
end
|
73
75
|
|
74
76
|
# TODO: support streaming requests
|
@@ -10,6 +10,9 @@ module Faraday
|
|
10
10
|
def call(env)
|
11
11
|
super
|
12
12
|
|
13
|
+
# enable compression
|
14
|
+
client.transparent_gzip_decompression = true
|
15
|
+
|
13
16
|
if req = env[:request]
|
14
17
|
if proxy = req[:proxy]
|
15
18
|
configure_proxy proxy
|
@@ -26,6 +29,8 @@ module Faraday
|
|
26
29
|
configure_ssl ssl
|
27
30
|
end
|
28
31
|
|
32
|
+
configure_client
|
33
|
+
|
29
34
|
# TODO Don't stream yet.
|
30
35
|
# https://github.com/nahi/httpclient/pull/90
|
31
36
|
env[:body] = env[:body].read if env[:body].respond_to? :read
|
@@ -34,19 +39,19 @@ module Faraday
|
|
34
39
|
:body => env[:body],
|
35
40
|
:header => env[:request_headers]
|
36
41
|
|
37
|
-
save_response env, resp.status, resp.body, resp.headers
|
42
|
+
save_response env, resp.status, resp.body, resp.headers, resp.reason
|
38
43
|
|
39
44
|
@app.call env
|
40
|
-
rescue ::HTTPClient::TimeoutError
|
41
|
-
raise Faraday::
|
45
|
+
rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT
|
46
|
+
raise Faraday::TimeoutError, $!
|
42
47
|
rescue ::HTTPClient::BadResponseError => err
|
43
48
|
if err.message.include?('status 407')
|
44
|
-
raise Faraday::
|
49
|
+
raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
45
50
|
else
|
46
|
-
raise Faraday::
|
51
|
+
raise Faraday::ClientError, $!
|
47
52
|
end
|
48
|
-
rescue Errno::ECONNREFUSED,
|
49
|
-
raise Faraday::
|
53
|
+
rescue Errno::ECONNREFUSED, IOError, SocketError
|
54
|
+
raise Faraday::ConnectionFailed, $!
|
50
55
|
rescue => err
|
51
56
|
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
52
57
|
raise Faraday::SSLError, err
|
@@ -69,14 +74,14 @@ module Faraday
|
|
69
74
|
|
70
75
|
def configure_ssl(ssl)
|
71
76
|
ssl_config = client.ssl_config
|
77
|
+
ssl_config.verify_mode = ssl_verify_mode(ssl)
|
78
|
+
ssl_config.cert_store = ssl_cert_store(ssl)
|
72
79
|
|
73
80
|
ssl_config.add_trust_ca ssl[:ca_file] if ssl[:ca_file]
|
74
81
|
ssl_config.add_trust_ca ssl[:ca_path] if ssl[:ca_path]
|
75
|
-
ssl_config.cert_store = ssl[:cert_store] if ssl[:cert_store]
|
76
82
|
ssl_config.client_cert = ssl[:client_cert] if ssl[:client_cert]
|
77
83
|
ssl_config.client_key = ssl[:client_key] if ssl[:client_key]
|
78
84
|
ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
|
79
|
-
ssl_config.verify_mode = ssl_verify_mode(ssl)
|
80
85
|
end
|
81
86
|
|
82
87
|
def configure_timeouts(req)
|
@@ -92,6 +97,23 @@ module Faraday
|
|
92
97
|
end
|
93
98
|
end
|
94
99
|
|
100
|
+
def configure_client
|
101
|
+
@config_block.call(client) if @config_block
|
102
|
+
end
|
103
|
+
|
104
|
+
def ssl_cert_store(ssl)
|
105
|
+
return ssl[:cert_store] if ssl[:cert_store]
|
106
|
+
# Memoize the cert store so that the same one is passed to
|
107
|
+
# HTTPClient each time, to avoid resyncing SSL sesions when
|
108
|
+
# it's changed
|
109
|
+
@cert_store ||= begin
|
110
|
+
# Use the default cert store by default, i.e. system ca certs
|
111
|
+
cert_store = OpenSSL::X509::Store.new
|
112
|
+
cert_store.set_default_paths
|
113
|
+
cert_store
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
95
117
|
def ssl_verify_mode(ssl)
|
96
118
|
ssl[:verify_mode] || begin
|
97
119
|
if ssl.fetch(:verify, true)
|
@@ -10,13 +10,15 @@ module Faraday
|
|
10
10
|
class Adapter
|
11
11
|
class NetHttp < Faraday::Adapter
|
12
12
|
NET_HTTP_EXCEPTIONS = [
|
13
|
-
|
13
|
+
IOError,
|
14
|
+
Errno::EADDRNOTAVAIL,
|
14
15
|
Errno::ECONNABORTED,
|
15
16
|
Errno::ECONNREFUSED,
|
16
17
|
Errno::ECONNRESET,
|
17
18
|
Errno::EHOSTUNREACH,
|
18
19
|
Errno::EINVAL,
|
19
20
|
Errno::ENETUNREACH,
|
21
|
+
Errno::EPIPE,
|
20
22
|
Net::HTTPBadResponse,
|
21
23
|
Net::HTTPHeaderSyntaxError,
|
22
24
|
Net::ProtocolError,
|
@@ -27,14 +29,16 @@ module Faraday
|
|
27
29
|
NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
|
28
30
|
NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
|
29
31
|
|
32
|
+
def initialize(app = nil, opts = {}, &block)
|
33
|
+
@cert_store = nil
|
34
|
+
super(app, opts, &block)
|
35
|
+
end
|
36
|
+
|
30
37
|
def call(env)
|
31
38
|
super
|
32
39
|
with_net_http_connection(env) do |http|
|
33
40
|
configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
|
34
|
-
|
35
|
-
req = env[:request]
|
36
|
-
http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
|
37
|
-
http.open_timeout = req[:open_timeout] if req[:open_timeout]
|
41
|
+
configure_request(http, env[:request])
|
38
42
|
|
39
43
|
begin
|
40
44
|
http_response = perform_request(http, env)
|
@@ -42,11 +46,11 @@ module Faraday
|
|
42
46
|
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
43
47
|
raise Faraday::SSLError, err
|
44
48
|
else
|
45
|
-
raise
|
49
|
+
raise Faraday::ConnectionFailed, err
|
46
50
|
end
|
47
51
|
end
|
48
52
|
|
49
|
-
save_response(env, http_response.code.to_i, http_response.body || '') do |response_headers|
|
53
|
+
save_response(env, http_response.code.to_i, http_response.body || '', nil, http_response.message) do |response_headers|
|
50
54
|
http_response.each_header do |key, value|
|
51
55
|
response_headers[key] = value
|
52
56
|
end
|
@@ -54,10 +58,12 @@ module Faraday
|
|
54
58
|
end
|
55
59
|
|
56
60
|
@app.call env
|
57
|
-
rescue Timeout::Error => err
|
58
|
-
raise Faraday::
|
61
|
+
rescue Timeout::Error, Errno::ETIMEDOUT => err
|
62
|
+
raise Faraday::TimeoutError, err
|
59
63
|
end
|
60
64
|
|
65
|
+
private
|
66
|
+
|
61
67
|
def create_request(env)
|
62
68
|
request = Net::HTTPGenericRequest.new \
|
63
69
|
env[:method].to_s.upcase, # request method
|
@@ -89,10 +95,10 @@ module Faraday
|
|
89
95
|
|
90
96
|
def net_http_connection(env)
|
91
97
|
if proxy = env[:request][:proxy]
|
92
|
-
Net::HTTP::Proxy(proxy[:uri].
|
98
|
+
Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, proxy[:user], proxy[:password])
|
93
99
|
else
|
94
100
|
Net::HTTP
|
95
|
-
end.new(env[:url].
|
101
|
+
end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80))
|
96
102
|
end
|
97
103
|
|
98
104
|
def configure_ssl(http, ssl)
|
@@ -106,14 +112,31 @@ module Faraday
|
|
106
112
|
http.ca_path = ssl[:ca_path] if ssl[:ca_path]
|
107
113
|
http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
|
108
114
|
http.ssl_version = ssl[:version] if ssl[:version]
|
115
|
+
http.min_version = ssl[:min_version] if ssl[:min_version]
|
116
|
+
http.max_version = ssl[:max_version] if ssl[:max_version]
|
117
|
+
end
|
118
|
+
|
119
|
+
def configure_request(http, req)
|
120
|
+
if req[:timeout]
|
121
|
+
http.read_timeout = req[:timeout]
|
122
|
+
http.open_timeout = req[:timeout]
|
123
|
+
http.write_timeout = req[:timeout] if http.respond_to?(:write_timeout=)
|
124
|
+
end
|
125
|
+
http.open_timeout = req[:open_timeout] if req[:open_timeout]
|
126
|
+
http.write_timeout = req[:write_timeout] if req[:write_timeout] && http.respond_to?(:write_timeout=)
|
127
|
+
# Only set if Net::Http supports it, since Ruby 2.5.
|
128
|
+
http.max_retries = 0 if http.respond_to?(:max_retries=)
|
129
|
+
|
130
|
+
@config_block.call(http) if @config_block
|
109
131
|
end
|
110
132
|
|
111
133
|
def ssl_cert_store(ssl)
|
112
134
|
return ssl[:cert_store] if ssl[:cert_store]
|
135
|
+
return @cert_store if @cert_store
|
113
136
|
# Use the default cert store by default, i.e. system ca certs
|
114
|
-
cert_store = OpenSSL::X509::Store.new
|
115
|
-
cert_store.set_default_paths
|
116
|
-
cert_store
|
137
|
+
@cert_store = OpenSSL::X509::Store.new
|
138
|
+
@cert_store.set_default_paths
|
139
|
+
@cert_store
|
117
140
|
end
|
118
141
|
|
119
142
|
def ssl_verify_mode(ssl)
|
@@ -1,15 +1,28 @@
|
|
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'
|
4
|
-
|
5
1
|
module Faraday
|
6
2
|
class Adapter
|
7
|
-
# Experimental adapter for net-http-persistent
|
8
3
|
class NetHttpPersistent < NetHttp
|
9
4
|
dependency 'net/http/persistent'
|
10
5
|
|
11
|
-
|
12
|
-
|
6
|
+
private
|
7
|
+
|
8
|
+
def net_http_connection(env)
|
9
|
+
@cached_connection ||=
|
10
|
+
if Net::HTTP::Persistent.instance_method(:initialize).parameters.first == [:key, :name]
|
11
|
+
options = {name: 'Faraday'}
|
12
|
+
options[:pool_size] = @connection_options[:pool_size] if @connection_options.key?(:pool_size)
|
13
|
+
Net::HTTP::Persistent.new(**options)
|
14
|
+
else
|
15
|
+
Net::HTTP::Persistent.new('Faraday')
|
16
|
+
end
|
17
|
+
|
18
|
+
proxy_uri = proxy_uri(env)
|
19
|
+
@cached_connection.proxy = proxy_uri if @cached_connection.proxy_uri != proxy_uri
|
20
|
+
@cached_connection
|
21
|
+
end
|
22
|
+
|
23
|
+
def proxy_uri(env)
|
24
|
+
proxy_uri = nil
|
25
|
+
if (proxy = env[:request][:proxy])
|
13
26
|
proxy_uri = ::URI::HTTP === proxy[:uri] ? proxy[:uri].dup : ::URI.parse(proxy[:uri].to_s)
|
14
27
|
proxy_uri.user = proxy_uri.password = nil
|
15
28
|
# awful patch for net-http-persistent 2.8 not unescaping user/password
|
@@ -18,30 +31,37 @@ module Faraday
|
|
18
31
|
define_method(:password) { proxy[:password] }
|
19
32
|
end if proxy[:user]
|
20
33
|
end
|
21
|
-
|
22
|
-
yield Net::HTTP::Persistent.new 'Faraday', proxy_uri
|
34
|
+
proxy_uri
|
23
35
|
end
|
24
36
|
|
25
37
|
def perform_request(http, env)
|
26
38
|
http.request env[:url], create_request(env)
|
39
|
+
rescue Errno::ETIMEDOUT => error
|
40
|
+
raise Faraday::TimeoutError, error
|
27
41
|
rescue Net::HTTP::Persistent::Error => error
|
28
42
|
if error.message.include? 'Timeout'
|
29
|
-
raise Faraday::
|
43
|
+
raise Faraday::TimeoutError, error
|
30
44
|
elsif error.message.include? 'connection refused'
|
31
|
-
raise Faraday::
|
45
|
+
raise Faraday::ConnectionFailed, error
|
32
46
|
else
|
33
47
|
raise
|
34
48
|
end
|
35
49
|
end
|
36
50
|
|
37
51
|
def configure_ssl(http, ssl)
|
38
|
-
http
|
39
|
-
http
|
52
|
+
http_set(http, :verify_mode, ssl_verify_mode(ssl))
|
53
|
+
http_set(http, :cert_store, ssl_cert_store(ssl))
|
54
|
+
|
55
|
+
http_set(http, :certificate, ssl[:client_cert]) if ssl[:client_cert]
|
56
|
+
http_set(http, :private_key, ssl[:client_key]) if ssl[:client_key]
|
57
|
+
http_set(http, :ca_file, ssl[:ca_file]) if ssl[:ca_file]
|
58
|
+
http_set(http, :ssl_version, ssl[:version]) if ssl[:version]
|
59
|
+
end
|
40
60
|
|
41
|
-
|
42
|
-
http.
|
43
|
-
|
44
|
-
|
61
|
+
def http_set(http, attr, value)
|
62
|
+
if http.send(attr) != value
|
63
|
+
http.send("#{attr}=", value)
|
64
|
+
end
|
45
65
|
end
|
46
66
|
end
|
47
67
|
end
|
@@ -3,18 +3,14 @@ module Faraday
|
|
3
3
|
class Patron < Faraday::Adapter
|
4
4
|
dependency 'patron'
|
5
5
|
|
6
|
-
def initialize(app, &block)
|
7
|
-
super(app)
|
8
|
-
@block = block
|
9
|
-
end
|
10
|
-
|
11
6
|
def call(env)
|
12
7
|
super
|
13
|
-
|
14
8
|
# TODO: support streaming requests
|
15
9
|
env[:body] = env[:body].read if env[:body].respond_to? :read
|
16
10
|
|
17
|
-
session =
|
11
|
+
session = ::Patron::Session.new
|
12
|
+
@config_block.call(session) if @config_block
|
13
|
+
configure_ssl(session, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
|
18
14
|
|
19
15
|
if req = env[:request]
|
20
16
|
session.timeout = session.connect_timeout = req[:timeout] if req[:timeout]
|
@@ -32,23 +28,26 @@ module Faraday
|
|
32
28
|
data = env[:body] ? env[:body].to_s : nil
|
33
29
|
session.request(env[:method], env[:url].to_s, env[:request_headers], :data => data)
|
34
30
|
rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed
|
35
|
-
raise
|
31
|
+
raise Faraday::ConnectionFailed, $!
|
36
32
|
end
|
37
33
|
|
38
|
-
|
34
|
+
# Remove the "HTTP/1.1 200", leaving just the reason phrase
|
35
|
+
reason_phrase = response.status_line.gsub(/^.* \d{3} /, '')
|
36
|
+
|
37
|
+
save_response(env, response.status, response.body, response.headers, reason_phrase)
|
39
38
|
|
40
39
|
@app.call env
|
41
40
|
rescue ::Patron::TimeoutError => err
|
42
|
-
if err.message
|
43
|
-
raise Faraday::
|
41
|
+
if connection_timed_out_message?(err.message)
|
42
|
+
raise Faraday::ConnectionFailed, err
|
44
43
|
else
|
45
|
-
raise Faraday::
|
44
|
+
raise Faraday::TimeoutError, err
|
46
45
|
end
|
47
46
|
rescue ::Patron::Error => err
|
48
47
|
if err.message.include?("code 407")
|
49
|
-
raise
|
48
|
+
raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
50
49
|
else
|
51
|
-
raise
|
50
|
+
raise Faraday::ConnectionFailed, err
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
@@ -56,17 +55,41 @@ module Faraday
|
|
56
55
|
# HAX: helps but doesn't work completely
|
57
56
|
# https://github.com/toland/patron/issues/34
|
58
57
|
::Patron::Request::VALID_ACTIONS.tap do |actions|
|
59
|
-
|
60
|
-
|
58
|
+
if actions[0].is_a?(Symbol)
|
59
|
+
actions << :patch unless actions.include? :patch
|
60
|
+
actions << :options unless actions.include? :options
|
61
|
+
else
|
62
|
+
# Patron 0.4.20 and up
|
63
|
+
actions << "PATCH" unless actions.include? "PATCH"
|
64
|
+
actions << "OPTIONS" unless actions.include? "OPTIONS"
|
65
|
+
end
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
+
def configure_ssl(session, ssl)
|
70
|
+
if ssl.fetch(:verify, true)
|
71
|
+
session.cacert = ssl[:ca_file]
|
72
|
+
else
|
73
|
+
session.insecure = true
|
74
|
+
end
|
69
75
|
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
CURL_TIMEOUT_MESSAGES = [ "Connection time-out",
|
80
|
+
"Connection timed out",
|
81
|
+
"Timed out before name resolve",
|
82
|
+
"server connect has timed out",
|
83
|
+
"Resolving timed out",
|
84
|
+
"name lookup timed out",
|
85
|
+
"timed out before SSL",
|
86
|
+
"connect() timed out"
|
87
|
+
].freeze
|
88
|
+
|
89
|
+
def connection_timed_out_message?(message)
|
90
|
+
CURL_TIMEOUT_MESSAGES.any? { |curl_message| message.include?(curl_message) }
|
91
|
+
end
|
92
|
+
|
70
93
|
end
|
71
94
|
end
|
72
95
|
end
|
data/lib/faraday/adapter/rack.rb
CHANGED
@@ -41,7 +41,7 @@ module Faraday
|
|
41
41
|
|
42
42
|
timeout = env[:request][:timeout] || env[:request][:open_timeout]
|
43
43
|
response = if timeout
|
44
|
-
Timer.timeout(timeout, Faraday::
|
44
|
+
Timer.timeout(timeout, Faraday::TimeoutError) { execute_request(env, rack_env) }
|
45
45
|
else
|
46
46
|
execute_request(env, rack_env)
|
47
47
|
end
|