diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 0d6f1452a..0b9fa097f 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -8,6 +8,21 @@ module Faraday class Adapter class NetHttp < Faraday::Adapter + NET_HTTP_EXCEPTIONS = [ + EOFError, + Errno::ECONNABORTED, + Errno::ECONNREFUSED, + Errno::ECONNRESET, + Errno::EINVAL, + Net::HTTPBadResponse, + Net::HTTPHeaderSyntaxError, + Net::ProtocolError, + SocketError + ] + + NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL) + + def call(env) super url = env[:url] @@ -61,7 +76,7 @@ def call(env) else http.request http_request, env[:body] end - rescue Errno::ECONNREFUSED + rescue *NET_HTTP_EXCEPTIONS raise Error::ConnectionFailed, $! end diff --git a/test/adapters/net_http_test.rb b/test/adapters/net_http_test.rb index 25be6133f..429b6dad4 100644 --- a/test/adapters/net_http_test.rb +++ b/test/adapters/net_http_test.rb @@ -22,10 +22,35 @@ def test_handles_compression_transparently_on_get @connection.get('/hello') end - def test_connect_error_gets_wrapped - stub_request(:get, 'disney.com/hello').to_raise(Errno::ECONNREFUSED) + def test_connection_errors_get_wrapped + exceptions = [ + EOFError, + Errno::ECONNABORTED, + Errno::ECONNREFUSED, + Errno::ECONNRESET, + Errno::EINVAL, + Net::HTTPBadResponse, + Net::HTTPHeaderSyntaxError, + Net::ProtocolError, + SocketError + ] - assert_raise Faraday::Error::ConnectionFailed do + exceptions << OpenSSL::SSL::SSLError if defined?(OpenSSL) + + exceptions.each do |exception_class| + stub_request(:get, 'disney.com/hello').to_raise(exception_class) + + assert_raise(Faraday::Error::ConnectionFailed, + "Failed to wrap #{exception_class} exceptions") do + @connection.get('/hello') + end + end + end + + def test_timeout_errors_get_wrapped + stub_request(:get, 'disney.com/hello').to_raise(Timeout::Error) + + assert_raise Faraday::Error::TimeoutError do @connection.get('/hello') end end