diff --git a/Gemfile b/Gemfile index 92e6e3933..faf5accc3 100644 --- a/Gemfile +++ b/Gemfile @@ -21,7 +21,6 @@ group :test, :development do gem 'coveralls_reborn', require: false gem 'em-http-request', '>= 1.1', require: 'em-http' gem 'em-synchrony', '>= 1.0.3', require: %w[em-synchrony em-synchrony/em-http] - gem 'excon', '>= 0.27.4' gem 'httpclient', '>= 2.2' gem 'multipart-parser' gem 'patron', '>= 0.4.2', platforms: :ruby diff --git a/faraday.gemspec b/faraday.gemspec index 12e6bd137..260234aaa 100644 --- a/faraday.gemspec +++ b/faraday.gemspec @@ -15,6 +15,7 @@ Gem::Specification.new do |spec| spec.required_ruby_version = '>= 2.4' + spec.add_dependency 'faraday-excon', '~> 1.0' spec.add_dependency 'faraday-net_http', '~> 1.0' spec.add_dependency 'faraday-net_http_persistent', '~> 1.0' spec.add_dependency 'multipart-post', '>= 1.2', '< 3' diff --git a/lib/faraday.rb b/lib/faraday.rb index 8a6b7750a..d376b92e4 100644 --- a/lib/faraday.rb +++ b/lib/faraday.rb @@ -28,6 +28,8 @@ require 'faraday/param_part' require 'faraday/net_http' +require 'faraday/net_http_persistent' +require 'faraday/excon' # This is the main namespace for Faraday. # diff --git a/lib/faraday/adapter.rb b/lib/faraday/adapter.rb index 395786691..f48cfde29 100644 --- a/lib/faraday/adapter.rb +++ b/lib/faraday/adapter.rb @@ -11,15 +11,10 @@ class Adapter register_middleware File.expand_path('adapter', __dir__), test: [:Test, 'test'], - net_http_persistent: [ - :NetHttpPersistent, - 'net_http_persistent' - ], typhoeus: [:Typhoeus, 'typhoeus'], patron: [:Patron, 'patron'], em_synchrony: [:EMSynchrony, 'em_synchrony'], em_http: [:EMHttp, 'em_http'], - excon: [:Excon, 'excon'], rack: [:Rack, 'rack'], httpclient: [:HTTPClient, 'httpclient'] diff --git a/lib/faraday/adapter/excon.rb b/lib/faraday/adapter/excon.rb deleted file mode 100644 index 7febdf927..000000000 --- a/lib/faraday/adapter/excon.rb +++ /dev/null @@ -1,124 +0,0 @@ -# frozen_string_literal: true - -module Faraday - class Adapter - # Excon adapter. - class Excon < Faraday::Adapter - dependency 'excon' - - def build_connection(env) - opts = opts_from_env(env) - ::Excon.new(env[:url].to_s, opts.merge(@connection_options)) - end - - def call(env) - super - - req_opts = { - method: env[:method].to_s.upcase, - headers: env[:request_headers], - body: read_body(env) - } - - req = env[:request] - if req&.stream_response? - total = 0 - req_opts[:response_block] = lambda do |chunk, _remain, _total| - req.on_data.call(chunk, total += chunk.size) - end - end - - resp = connection(env) { |http| http.request(req_opts) } - save_response(env, resp.status.to_i, resp.body, resp.headers, - resp.reason_phrase) - - @app.call(env) - rescue ::Excon::Errors::SocketError => e - raise Faraday::TimeoutError, e if e.message.match?(/\btimeout\b/) - - raise Faraday::SSLError, e if e.message.match?(/\bcertificate\b/) - - raise Faraday::ConnectionFailed, e - rescue ::Excon::Errors::Timeout => e - raise Faraday::TimeoutError, e - end - - # TODO: support streaming requests - def read_body(env) - env[:body].respond_to?(:read) ? env[:body].read : env[:body] - end - - private - - def opts_from_env(env) - opts = {} - amend_opts_with_ssl!(opts, env[:ssl]) if needs_ssl_settings?(env) - - if (req = env[:request]) - amend_opts_with_timeouts!(opts, req) - amend_opts_with_proxy_settings!(opts, req) - end - - opts - end - - def needs_ssl_settings?(env) - env[:url].scheme == 'https' && env[:ssl] - end - - OPTS_KEYS = [ - %i[client_cert client_cert], - %i[client_key client_key], - %i[certificate certificate], - %i[private_key private_key], - %i[ssl_ca_path ca_path], - %i[ssl_ca_file ca_file], - %i[ssl_version version], - %i[ssl_min_version min_version], - %i[ssl_max_version max_version] - ].freeze - - def amend_opts_with_ssl!(opts, ssl) - opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true) - # https://github.com/geemus/excon/issues/106 - # https://github.com/jruby/jruby-ossl/issues/19 - opts[:nonblock] = false - - OPTS_KEYS.each do |(key_in_opts, key_in_ssl)| - next unless ssl[key_in_ssl] - - opts[key_in_opts] = ssl[key_in_ssl] - end - end - - def amend_opts_with_timeouts!(opts, req) - if (sec = request_timeout(:read, req)) - opts[:read_timeout] = sec - end - - if (sec = request_timeout(:write, req)) - opts[:write_timeout] = sec - end - - return unless (sec = request_timeout(:open, req)) - - opts[:connect_timeout] = sec - end - - def amend_opts_with_proxy_settings!(opts, req) - opts[:proxy] = proxy_settings_for_opts(req[:proxy]) if req[:proxy] - end - - def proxy_settings_for_opts(proxy) - { - host: proxy[:uri].host, - hostname: proxy[:uri].hostname, - port: proxy[:uri].port, - scheme: proxy[:uri].scheme, - user: proxy[:user], - password: proxy[:password] - } - end - end - end -end diff --git a/lib/faraday/autoload.rb b/lib/faraday/autoload.rb index 61b93ac13..4c14ceec2 100644 --- a/lib/faraday/autoload.rb +++ b/lib/faraday/autoload.rb @@ -58,12 +58,10 @@ def all_loaded_constants class Adapter extend AutoloadHelper autoload_all 'faraday/adapter', - NetHttpPersistent: 'net_http_persistent', EMSynchrony: 'em_synchrony', EMHttp: 'em_http', Typhoeus: 'typhoeus', Patron: 'patron', - Excon: 'excon', Test: 'test', Rack: 'rack', HTTPClient: 'httpclient'