diff --git a/faraday.gemspec b/faraday.gemspec index a8a8175c2..3a5409233 100644 --- a/faraday.gemspec +++ b/faraday.gemspec @@ -2,7 +2,7 @@ require_relative 'lib/faraday/version' -Gem::Specification.new do |spec| +Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength spec.name = 'faraday' spec.version = Faraday::VERSION @@ -21,6 +21,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday-httpclient', '~> 1.0.1' spec.add_dependency 'faraday-net_http', '~> 1.0' spec.add_dependency 'faraday-net_http_persistent', '~> 1.1' + spec.add_dependency 'faraday-patron', '~> 1.0' spec.add_dependency 'multipart-post', '>= 1.2', '< 3' spec.add_dependency 'ruby2_keywords', '>= 0.0.4' diff --git a/lib/faraday.rb b/lib/faraday.rb index fd54a4b2a..df5126202 100644 --- a/lib/faraday.rb +++ b/lib/faraday.rb @@ -33,6 +33,7 @@ require 'faraday/httpclient' require 'faraday/net_http' require 'faraday/net_http_persistent' +require 'faraday/patron' # This is the main namespace for Faraday. # diff --git a/lib/faraday/adapter.rb b/lib/faraday/adapter.rb index 764286a3f..4a60e19b0 100644 --- a/lib/faraday/adapter.rb +++ b/lib/faraday/adapter.rb @@ -12,7 +12,6 @@ class Adapter register_middleware File.expand_path('adapter', __dir__), test: [:Test, 'test'], typhoeus: [:Typhoeus, 'typhoeus'], - patron: [:Patron, 'patron'], rack: [:Rack, 'rack'] # This module marks an Adapter as supporting parallel requests. diff --git a/lib/faraday/adapter/patron.rb b/lib/faraday/adapter/patron.rb deleted file mode 100644 index c6e2935fb..000000000 --- a/lib/faraday/adapter/patron.rb +++ /dev/null @@ -1,132 +0,0 @@ -# frozen_string_literal: true - -module Faraday - class Adapter - # Patron adapter. - class Patron < Faraday::Adapter - dependency 'patron' - - def build_connection(env) - session = ::Patron::Session.new - @config_block&.call(session) - if (env[:url].scheme == 'https') && env[:ssl] - configure_ssl(session, env[:ssl]) - end - - if (req = env[:request]) - configure_timeouts(session, req) - configure_proxy(session, req[:proxy]) - end - - session - end - - def call(env) - super - # TODO: support streaming requests - env[:body] = env[:body].read if env[:body].respond_to? :read - - response = connection(env) do |session| - begin - data = env[:body] ? env[:body].to_s : nil - session.request(env[:method], env[:url].to_s, - env[:request_headers], data: data) - rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed - raise Faraday::ConnectionFailed, $ERROR_INFO - end - end - - if (req = env[:request]).stream_response? - warn "Streaming downloads for #{self.class.name} " \ - 'are not yet implemented.' - req.on_data.call(response.body, response.body.bytesize) - end - # Remove the "HTTP/1.1 200", leaving just the reason phrase - reason_phrase = response.status_line.gsub(/^.* \d{3} /, '') - - save_response(env, response.status, response.body, - response.headers, reason_phrase) - - @app.call env - rescue ::Patron::TimeoutError => e - if connection_timed_out_message?(e.message) - raise Faraday::ConnectionFailed, e - end - - raise Faraday::TimeoutError, e - rescue ::Patron::Error => e - if e.message.include?('code 407') - raise Faraday::ConnectionFailed, - %(407 "Proxy Authentication Required ") - end - - raise Faraday::ConnectionFailed, e - end - - if loaded? && defined?(::Patron::Request::VALID_ACTIONS) - # HAX: helps but doesn't work completely - # https://github.com/toland/patron/issues/34 - ::Patron::Request::VALID_ACTIONS.tap do |actions| - if actions[0].is_a?(Symbol) - actions << :patch unless actions.include? :patch - actions << :options unless actions.include? :options - else - # Patron 0.4.20 and up - actions << 'PATCH' unless actions.include? 'PATCH' - actions << 'OPTIONS' unless actions.include? 'OPTIONS' - end - end - end - - def configure_ssl(session, ssl) - if ssl.fetch(:verify, true) - session.cacert = ssl[:ca_file] - else - session.insecure = true - end - end - - def configure_timeouts(session, req) - return unless req - - if (sec = request_timeout(:read, req)) - session.timeout = sec - end - - return unless (sec = request_timeout(:open, req)) - - session.connect_timeout = sec - end - - def configure_proxy(session, proxy) - return unless proxy - - proxy_uri = proxy[:uri].dup - proxy_uri.user = proxy[:user] && - Utils.escape(proxy[:user]).gsub('+', '%20') - proxy_uri.password = proxy[:password] && - Utils.escape(proxy[:password]).gsub('+', '%20') - session.proxy = proxy_uri.to_s - end - - private - - CURL_TIMEOUT_MESSAGES = [ - 'Connection time-out', - 'Connection timed out', - 'Timed out before name resolve', - 'server connect has timed out', - 'Resolving timed out', - 'name lookup timed out', - 'timed out before SSL', - 'connect() timed out' - ].freeze - - def connection_timed_out_message?(message) - CURL_TIMEOUT_MESSAGES.any? do |curl_message| - message.include?(curl_message) - end - end - end - end -end diff --git a/lib/faraday/autoload.rb b/lib/faraday/autoload.rb index b96b51367..7fcbe2620 100644 --- a/lib/faraday/autoload.rb +++ b/lib/faraday/autoload.rb @@ -59,7 +59,6 @@ class Adapter extend AutoloadHelper autoload_all 'faraday/adapter', Typhoeus: 'typhoeus', - Patron: 'patron', Test: 'test', Rack: 'rack' end