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 DependencyLoader

#load_error

Attributes included from Parallelism

#supports_parallel

Instance Method Summary collapse

Methods inherited from Faraday::Adapter

#initialize

Methods included from MiddlewareRegistry

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

Methods included from DependencyLoader

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

Methods included from Parallelism

#inherited, #supports_parallel?

Methods included from Faraday::AutoloadHelper

#all_loaded_constants, #autoload_all, #load_autoloaded_constants

Constructor Details

This class inherits a constructor from Faraday::Adapter

Instance Method Details

#call(env) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
65
66
67
68
69
# File 'lib/faraday/adapter/patron.rb', line 9

def call(env)
  super
  # TODO: support streaming requests
  env[:body] = env[:body].read if env[:body].respond_to? :read

  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])
    if req[:timeout]
      session.timeout = session.connect_timeout = req[:timeout]
    end
    session.connect_timeout = req[:open_timeout] if req[:open_timeout]

    if (proxy = req[: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
  end

  response = 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

  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_ssl(session, ssl) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/faraday/adapter/patron.rb', line 86

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