diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index e0a037297..987977539 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -53,14 +53,15 @@ def build_connection(env) end def net_http_connection(env) - klass = if (proxy = env[:request][:proxy]) - Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, - proxy[:user], proxy[:password]) - else - Net::HTTP - end + proxy = env[:request][:proxy] port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80) - klass.new(env[:url].hostname, port) + if proxy + Net::HTTP.new(env[:url].hostname, port, + proxy[:uri].hostname, proxy[:uri].port, + proxy[:user], proxy[:password]) + else + Net::HTTP.new(env[:url].hostname, port, nil) + end end def call(env) @@ -182,7 +183,7 @@ def configure_request(http, req) end if (sec = http.respond_to?(:write_timeout=) && - request_timeout(:write, req)) + request_timeout(:write, req)) http.write_timeout = sec end @@ -200,19 +201,19 @@ def ssl_cert_store(ssl) return ssl[:cert_store] if ssl[:cert_store] @ssl_cert_store ||= begin - # Use the default cert store by default, i.e. system ca certs - OpenSSL::X509::Store.new.tap(&:set_default_paths) - end + # Use the default cert store by default, i.e. system ca certs + OpenSSL::X509::Store.new.tap(&:set_default_paths) + end end def ssl_verify_mode(ssl) ssl[:verify_mode] || begin - if ssl.fetch(:verify, true) - OpenSSL::SSL::VERIFY_PEER - else - OpenSSL::SSL::VERIFY_NONE - end - end + if ssl.fetch(:verify, true) + OpenSSL::SSL::VERIFY_PEER + else + OpenSSL::SSL::VERIFY_NONE + end + end end end end diff --git a/spec/support/shared_examples/adapter.rb b/spec/support/shared_examples/adapter.rb index 33f261182..47c0d2432 100644 --- a/spec/support/shared_examples/adapter.rb +++ b/spec/support/shared_examples/adapter.rb @@ -33,6 +33,7 @@ let(:protocol) { ssl_mode? ? 'https' : 'http' } let(:remote) { "#{protocol}://example.com" } + let(:stub_remote) { remote } let(:conn) do conn_options[:ssl] ||= {} @@ -46,7 +47,7 @@ end end - let!(:request_stub) { stub_request(http_method, remote) } + let!(:request_stub) { stub_request(http_method, stub_remote) } after do expect(request_stub).to have_been_requested unless request_stub.disabled? diff --git a/spec/support/shared_examples/request_method.rb b/spec/support/shared_examples/request_method.rb index 05257ff6f..091c5f4ef 100644 --- a/spec/support/shared_examples/request_method.rb +++ b/spec/support/shared_examples/request_method.rb @@ -218,17 +218,41 @@ end end - it 'handles requests with proxy' do - conn_options[:proxy] = 'http://google.co.uk' + context 'when a proxy is provided as option' do + before do + conn_options[:proxy] = 'http://google.co.uk' + end + + it 'handles requests with proxy' do + res = conn.public_send(http_method, '/') + expect(res.status).to eq(200) + end - res = conn.public_send(http_method, '/') - expect(res.status).to eq(200) + it 'handles proxy failures' do + request_stub.to_return(status: 407) + + expect { conn.public_send(http_method, '/') }.to raise_error(Faraday::ProxyAuthError) + end end - it 'handles proxy failures' do - conn_options[:proxy] = 'http://google.co.uk' - request_stub.to_return(status: 407) + context 'when http_proxy env variable is set' do + let(:proxy_url) { 'http://env-proxy.com:80' } + + around do |example| + with_env 'http_proxy' => proxy_url do + example.run + end + end + + it 'handles requests with proxy' do + res = conn.public_send(http_method, '/') + expect(res.status).to eq(200) + end + + it 'handles proxy failures' do + request_stub.to_return(status: 407) - expect { conn.public_send(http_method, '/') }.to raise_error(Faraday::ProxyAuthError) + expect { conn.public_send(http_method, '/') }.to raise_error(Faraday::ProxyAuthError) + end end end