diff --git a/lib/faraday/adapter.rb b/lib/faraday/adapter.rb index 6a3bb7d5..dd547df8 100644 --- a/lib/faraday/adapter.rb +++ b/lib/faraday/adapter.rb @@ -46,6 +46,19 @@ module Faraday @config_block = block end + # Yields an adapter's configured connection. Depends on #build_connection + # being defined on this adapter. + # + # @param env [Faraday::Env, Hash] The env object for a faraday request. + # + # @return An HTTP client connection for this adapter. + def connection(env) + conn = build_connection(env) + return conn unless block_given? + + yield conn + end + def call(env) env.clear_body if env.needs_body? env.response = Response.new diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index d5c0061d..05d776c1 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -40,16 +40,26 @@ module Faraday super(app, opts, &block) end + def build_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 + port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80) + klass.new(env[:url].hostname, port).tap do |http| + configure_ssl(http, env[:ssl]) + configure_request(http, env[:request]) + http.use_ssl = env[:url].scheme == 'https' + end + end + def call(env) super - with_net_http_connection(env) do |http| - if (env[:url].scheme == 'https') && env[:ssl] - configure_ssl(http, env[:ssl]) - end - configure_request(http, env[:request]) - + http_response = connection(env) do |http| begin - http_response = perform_request(http, env) + perform_request(http, env) rescue *NET_HTTP_EXCEPTIONS => e if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError) raise Faraday::SSLError, e @@ -57,13 +67,13 @@ module Faraday raise Faraday::ConnectionFailed, e end + end - save_response(env, http_response.code.to_i, - http_response.body || '', nil, - http_response.message) do |response_headers| - http_response.each_header do |key, value| - response_headers[key] = value - end + save_response(env, http_response.code.to_i, + http_response.body || '', nil, + http_response.message) do |response_headers| + http_response.each_header do |key, value| + response_headers[key] = value end end @@ -134,23 +144,9 @@ module Faraday end end - def with_net_http_connection(env) - yield net_http_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 - port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80) - klass.new(env[:url].hostname, port) - end - def configure_ssl(http, ssl) - http.use_ssl = true + return unless ssl + http.verify_mode = ssl_verify_mode(ssl) http.cert_store = ssl_cert_store(ssl) diff --git a/lib/faraday/adapter/net_http_persistent.rb b/lib/faraday/adapter/net_http_persistent.rb index 1cf1a295..1b1b3e4e 100644 --- a/lib/faraday/adapter/net_http_persistent.rb +++ b/lib/faraday/adapter/net_http_persistent.rb @@ -8,7 +8,7 @@ module Faraday private - def net_http_connection(env) + def build_connection(env) @cached_connection ||= if Net::HTTP::Persistent.instance_method(:initialize) .parameters.first == %i[key name] diff --git a/spec/faraday/adapter/net_http_persistent_spec.rb b/spec/faraday/adapter/net_http_persistent_spec.rb index 19b54d7a..cdf85a13 100644 --- a/spec/faraday/adapter/net_http_persistent_spec.rb +++ b/spec/faraday/adapter/net_http_persistent_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Faraday::Adapter::NetHttpPersistent do http.idle_timeout = 123 end - http = adapter.send(:net_http_connection, url: url, request: {}) + http = adapter.send(:connection, url: url, request: {}) adapter.send(:configure_request, http, {}) expect(http.idle_timeout).to eq(123) @@ -23,7 +23,7 @@ RSpec.describe Faraday::Adapter::NetHttpPersistent do adapter = described_class.new - http = adapter.send(:net_http_connection, url: url, request: {}) + http = adapter.send(:connection, url: url, request: {}) adapter.send(:configure_request, http, {}) # `max_retries=` is only present in Ruby 2.5 @@ -35,7 +35,7 @@ RSpec.describe Faraday::Adapter::NetHttpPersistent do adapter = described_class.new(nil, pool_size: 5) - http = adapter.send(:net_http_connection, url: url, request: {}) + http = adapter.send(:connection, url: url, request: {}) # `pool` is only present in net_http_persistent >= 3.0 expect(http.pool.size).to eq(5) if http.respond_to?(:pool) @@ -47,7 +47,7 @@ RSpec.describe Faraday::Adapter::NetHttpPersistent do adapter = described_class.new(nil) - http = adapter.send(:net_http_connection, url: url, request: {}) + http = adapter.send(:connection, url: url, request: {}) adapter.send(:configure_ssl, http, min_version: :TLS1_2) # `min_version` is only present in net_http_persistent >= 3.1 (UNRELEASED) diff --git a/spec/faraday/adapter/net_http_spec.rb b/spec/faraday/adapter/net_http_spec.rb index 2197ab18..c24586cb 100644 --- a/spec/faraday/adapter/net_http_spec.rb +++ b/spec/faraday/adapter/net_http_spec.rb @@ -8,14 +8,16 @@ RSpec.describe Faraday::Adapter::NetHttp do context 'checking http' do let(:url) { URI('http://example.com') } let(:adapter) { described_class.new } - let(:http) { adapter.send(:net_http_connection, url: url, request: {}) } + let(:http) { adapter.send(:connection, url: url, request: {}) } it { expect(http.port).to eq(80) } + it 'sets max_retries to 0' do adapter.send(:configure_request, http, {}) expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=) end + it 'supports write_timeout' do adapter.send(:configure_request, http, write_timeout: 10)