Class: Faraday::Adapter::Patron

Inherits:
Faraday::Adapter show all
Defined in:
lib/faraday/adapter/patron.rb

Overview

Patron adapter.

Constant Summary

Constants inherited from Faraday::Adapter

CONTENT_LENGTH

Instance Attribute Summary

Attributes included from Parallelism

#supports_parallel

Attributes included from DependencyLoader

#load_error

Instance Method Summary collapse

Methods inherited from Faraday::Adapter

#close, #connection, #initialize

Methods included from Faraday::AutoloadHelper

#all_loaded_constants, #autoload_all, #load_autoloaded_constants

Methods included from Parallelism

#inherited, #supports_parallel?

Methods included from DependencyLoader

#dependency, #inherited, #loaded?, #new

Methods included from MiddlewareRegistry

#fetch_middleware, #load_middleware, #lookup_middleware, #middleware_mutex, #register_middleware, #unregister_middleware

Constructor Details

This class inherits a constructor from Faraday::Adapter

Instance Method Details

#build_connection(env) ⇒ Object


9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/faraday/adapter/patron.rb', line 9

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

#call(env) ⇒ Object


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/faraday/adapter/patron.rb', line 24

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

#configure_proxy(session, proxy) ⇒ Object


101
102
103
104
105
106
107
108
109
110
# File 'lib/faraday/adapter/patron.rb', line 101

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

#configure_ssl(session, ssl) ⇒ Object


81
82
83
84
85
86
87
# File 'lib/faraday/adapter/patron.rb', line 81

def configure_ssl(session, ssl)
  if ssl.fetch(:verify, true)
    session.cacert = ssl[:ca_file]
  else
    session.insecure = true
  end
end

#configure_timeouts(session, req) ⇒ Object


89
90
91
92
93
94
95
96
97
98
99
# File 'lib/faraday/adapter/patron.rb', line 89

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