faraday 0.15.4 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +380 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +16 -344
  5. data/Rakefile +7 -0
  6. data/examples/client_spec.rb +65 -0
  7. data/examples/client_test.rb +79 -0
  8. data/lib/faraday.rb +127 -190
  9. data/lib/faraday/adapter.rb +72 -22
  10. data/lib/faraday/adapter/test.rb +86 -53
  11. data/lib/faraday/adapter/typhoeus.rb +4 -1
  12. data/lib/faraday/adapter_registry.rb +30 -0
  13. data/lib/faraday/autoload.rb +39 -36
  14. data/lib/faraday/connection.rb +320 -183
  15. data/lib/faraday/dependency_loader.rb +37 -0
  16. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  17. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  18. data/lib/faraday/error.rb +123 -37
  19. data/lib/faraday/file_part.rb +128 -0
  20. data/lib/faraday/logging/formatter.rb +105 -0
  21. data/lib/faraday/methods.rb +6 -0
  22. data/lib/faraday/middleware.rb +19 -25
  23. data/lib/faraday/middleware_registry.rb +129 -0
  24. data/lib/faraday/options.rb +39 -194
  25. data/lib/faraday/options/connection_options.rb +22 -0
  26. data/lib/faraday/options/env.rb +181 -0
  27. data/lib/faraday/options/proxy_options.rb +32 -0
  28. data/lib/faraday/options/request_options.rb +22 -0
  29. data/lib/faraday/options/ssl_options.rb +59 -0
  30. data/lib/faraday/param_part.rb +53 -0
  31. data/lib/faraday/parameters.rb +4 -197
  32. data/lib/faraday/rack_builder.rb +77 -65
  33. data/lib/faraday/request.rb +86 -44
  34. data/lib/faraday/request/authorization.rb +44 -30
  35. data/lib/faraday/request/basic_authentication.rb +14 -7
  36. data/lib/faraday/request/instrumentation.rb +45 -27
  37. data/lib/faraday/request/multipart.rb +86 -48
  38. data/lib/faraday/request/retry.rb +198 -169
  39. data/lib/faraday/request/token_authentication.rb +15 -10
  40. data/lib/faraday/request/url_encoded.rb +43 -23
  41. data/lib/faraday/response.rb +27 -23
  42. data/lib/faraday/response/logger.rb +22 -69
  43. data/lib/faraday/response/raise_error.rb +49 -14
  44. data/lib/faraday/utils.rb +38 -247
  45. data/lib/faraday/utils/headers.rb +139 -0
  46. data/lib/faraday/utils/params_hash.rb +61 -0
  47. data/lib/faraday/version.rb +5 -0
  48. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  49. data/spec/faraday/adapter/em_http_spec.rb +49 -0
  50. data/spec/faraday/adapter/em_synchrony_spec.rb +18 -0
  51. data/spec/faraday/adapter/excon_spec.rb +49 -0
  52. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  53. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  54. data/spec/faraday/adapter/patron_spec.rb +18 -0
  55. data/spec/faraday/adapter/rack_spec.rb +8 -0
  56. data/spec/faraday/adapter/test_spec.rb +260 -0
  57. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  58. data/spec/faraday/adapter_registry_spec.rb +28 -0
  59. data/spec/faraday/adapter_spec.rb +55 -0
  60. data/spec/faraday/composite_read_io_spec.rb +80 -0
  61. data/spec/faraday/connection_spec.rb +736 -0
  62. data/spec/faraday/error_spec.rb +60 -0
  63. data/spec/faraday/middleware_spec.rb +52 -0
  64. data/spec/faraday/options/env_spec.rb +70 -0
  65. data/spec/faraday/options/options_spec.rb +297 -0
  66. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  67. data/spec/faraday/options/request_options_spec.rb +19 -0
  68. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  69. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  70. data/spec/faraday/rack_builder_spec.rb +345 -0
  71. data/spec/faraday/request/authorization_spec.rb +88 -0
  72. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  73. data/spec/faraday/request/multipart_spec.rb +302 -0
  74. data/spec/faraday/request/retry_spec.rb +242 -0
  75. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  76. data/spec/faraday/request_spec.rb +120 -0
  77. data/spec/faraday/response/logger_spec.rb +220 -0
  78. data/spec/faraday/response/middleware_spec.rb +68 -0
  79. data/spec/faraday/response/raise_error_spec.rb +169 -0
  80. data/spec/faraday/response_spec.rb +75 -0
  81. data/spec/faraday/utils/headers_spec.rb +82 -0
  82. data/spec/faraday/utils_spec.rb +56 -0
  83. data/spec/faraday_spec.rb +37 -0
  84. data/spec/spec_helper.rb +132 -0
  85. data/spec/support/disabling_stub.rb +14 -0
  86. data/spec/support/fake_safe_buffer.rb +15 -0
  87. data/spec/support/helper_methods.rb +133 -0
  88. data/spec/support/shared_examples/adapter.rb +105 -0
  89. data/spec/support/shared_examples/params_encoder.rb +18 -0
  90. data/spec/support/shared_examples/request_method.rb +262 -0
  91. data/spec/support/streaming_response_checker.rb +35 -0
  92. data/spec/support/webmock_rack_app.rb +68 -0
  93. metadata +206 -19
  94. data/lib/faraday/adapter/em_http.rb +0 -243
  95. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  96. data/lib/faraday/adapter/em_synchrony.rb +0 -106
  97. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  98. data/lib/faraday/adapter/excon.rb +0 -82
  99. data/lib/faraday/adapter/httpclient.rb +0 -128
  100. data/lib/faraday/adapter/net_http.rb +0 -152
  101. data/lib/faraday/adapter/net_http_persistent.rb +0 -68
  102. data/lib/faraday/adapter/patron.rb +0 -95
  103. data/lib/faraday/adapter/rack.rb +0 -58
  104. data/lib/faraday/upload_io.rb +0 -67
@@ -1,82 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class Excon < Faraday::Adapter
4
- dependency 'excon'
5
-
6
- def call(env)
7
- super
8
-
9
- opts = {}
10
- if env[:url].scheme == 'https' && ssl = env[:ssl]
11
- opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true)
12
- opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path]
13
- opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file]
14
- opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert]
15
- opts[:client_key] = ssl[:client_key] if ssl[:client_key]
16
- opts[:certificate] = ssl[:certificate] if ssl[:certificate]
17
- opts[:private_key] = ssl[:private_key] if ssl[:private_key]
18
- opts[:ssl_version] = ssl[:version] if ssl[:version]
19
- opts[:ssl_min_version] = ssl[:min_version] if ssl[:min_version]
20
- opts[:ssl_max_version] = ssl[:max_version] if ssl[:max_version]
21
-
22
- # https://github.com/geemus/excon/issues/106
23
- # https://github.com/jruby/jruby-ossl/issues/19
24
- opts[:nonblock] = false
25
- end
26
-
27
- if ( req = env[:request] )
28
- if req[:timeout]
29
- opts[:read_timeout] = req[:timeout]
30
- opts[:connect_timeout] = req[:timeout]
31
- opts[:write_timeout] = req[:timeout]
32
- end
33
-
34
- if req[:open_timeout]
35
- opts[:connect_timeout] = req[:open_timeout]
36
- end
37
-
38
- if req[:proxy]
39
- opts[:proxy] = {
40
- :host => req[:proxy][:uri].host,
41
- :hostname => req[:proxy][:uri].hostname,
42
- :port => req[:proxy][:uri].port,
43
- :scheme => req[:proxy][:uri].scheme,
44
- :user => req[:proxy][:user],
45
- :password => req[:proxy][:password]
46
- }
47
- end
48
- end
49
-
50
- conn = create_connection(env, opts)
51
-
52
- resp = conn.request \
53
- :method => env[:method].to_s.upcase,
54
- :headers => env[:request_headers],
55
- :body => read_body(env)
56
-
57
- save_response(env, resp.status.to_i, resp.body, resp.headers, resp.reason_phrase)
58
-
59
- @app.call env
60
- rescue ::Excon::Errors::SocketError => err
61
- if err.message =~ /\btimeout\b/
62
- raise Error::TimeoutError, err
63
- elsif err.message =~ /\bcertificate\b/
64
- raise Faraday::SSLError, err
65
- else
66
- raise Error::ConnectionFailed, err
67
- end
68
- rescue ::Excon::Errors::Timeout => err
69
- raise Error::TimeoutError, err
70
- end
71
-
72
- def create_connection(env, opts)
73
- ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
74
- end
75
-
76
- # TODO: support streaming requests
77
- def read_body(env)
78
- env[:body].respond_to?(:read) ? env[:body].read : env[:body]
79
- end
80
- end
81
- end
82
- end
@@ -1,128 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class HTTPClient < Faraday::Adapter
4
- dependency 'httpclient'
5
-
6
- def client
7
- @client ||= ::HTTPClient.new
8
- end
9
-
10
- def call(env)
11
- super
12
-
13
- # enable compression
14
- client.transparent_gzip_decompression = true
15
-
16
- if req = env[:request]
17
- if proxy = req[:proxy]
18
- configure_proxy proxy
19
- end
20
-
21
- if bind = req[:bind]
22
- configure_socket bind
23
- end
24
-
25
- configure_timeouts req
26
- end
27
-
28
- if env[:url].scheme == 'https' && ssl = env[:ssl]
29
- configure_ssl ssl
30
- end
31
-
32
- configure_client
33
-
34
- # TODO Don't stream yet.
35
- # https://github.com/nahi/httpclient/pull/90
36
- env[:body] = env[:body].read if env[:body].respond_to? :read
37
-
38
- resp = client.request env[:method], env[:url],
39
- :body => env[:body],
40
- :header => env[:request_headers]
41
-
42
- save_response env, resp.status, resp.body, resp.headers, resp.reason
43
-
44
- @app.call env
45
- rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT
46
- raise Faraday::Error::TimeoutError, $!
47
- rescue ::HTTPClient::BadResponseError => err
48
- if err.message.include?('status 407')
49
- raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
50
- else
51
- raise Faraday::Error::ClientError, $!
52
- end
53
- rescue Errno::ECONNREFUSED, IOError, SocketError
54
- raise Faraday::Error::ConnectionFailed, $!
55
- rescue => err
56
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
57
- raise Faraday::SSLError, err
58
- else
59
- raise
60
- end
61
- end
62
-
63
- def configure_socket(bind)
64
- client.socket_local.host = bind[:host]
65
- client.socket_local.port = bind[:port]
66
- end
67
-
68
- def configure_proxy(proxy)
69
- client.proxy = proxy[:uri]
70
- if proxy[:user] && proxy[:password]
71
- client.set_proxy_auth proxy[:user], proxy[:password]
72
- end
73
- end
74
-
75
- def configure_ssl(ssl)
76
- ssl_config = client.ssl_config
77
- ssl_config.verify_mode = ssl_verify_mode(ssl)
78
- ssl_config.cert_store = ssl_cert_store(ssl)
79
-
80
- ssl_config.add_trust_ca ssl[:ca_file] if ssl[:ca_file]
81
- ssl_config.add_trust_ca ssl[:ca_path] if ssl[:ca_path]
82
- ssl_config.client_cert = ssl[:client_cert] if ssl[:client_cert]
83
- ssl_config.client_key = ssl[:client_key] if ssl[:client_key]
84
- ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
85
- end
86
-
87
- def configure_timeouts(req)
88
- if req[:timeout]
89
- client.connect_timeout = req[:timeout]
90
- client.receive_timeout = req[:timeout]
91
- client.send_timeout = req[:timeout]
92
- end
93
-
94
- if req[:open_timeout]
95
- client.connect_timeout = req[:open_timeout]
96
- client.send_timeout = req[:open_timeout]
97
- end
98
- end
99
-
100
- def configure_client
101
- @config_block.call(client) if @config_block
102
- end
103
-
104
- def ssl_cert_store(ssl)
105
- return ssl[:cert_store] if ssl[:cert_store]
106
- # Memoize the cert store so that the same one is passed to
107
- # HTTPClient each time, to avoid resyncing SSL sesions when
108
- # it's changed
109
- @cert_store ||= begin
110
- # Use the default cert store by default, i.e. system ca certs
111
- cert_store = OpenSSL::X509::Store.new
112
- cert_store.set_default_paths
113
- cert_store
114
- end
115
- end
116
-
117
- def ssl_verify_mode(ssl)
118
- ssl[:verify_mode] || begin
119
- if ssl.fetch(:verify, true)
120
- OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
121
- else
122
- OpenSSL::SSL::VERIFY_NONE
123
- end
124
- end
125
- end
126
- end
127
- end
128
- end
@@ -1,152 +0,0 @@
1
- begin
2
- require 'net/https'
3
- rescue LoadError
4
- warn "Warning: no such file to load -- net/https. Make sure openssl is installed if you want ssl support"
5
- require 'net/http'
6
- end
7
- require 'zlib'
8
-
9
- module Faraday
10
- class Adapter
11
- class NetHttp < Faraday::Adapter
12
- NET_HTTP_EXCEPTIONS = [
13
- IOError,
14
- Errno::ECONNABORTED,
15
- Errno::ECONNREFUSED,
16
- Errno::ECONNRESET,
17
- Errno::EHOSTUNREACH,
18
- Errno::EINVAL,
19
- Errno::ENETUNREACH,
20
- Errno::EPIPE,
21
- Net::HTTPBadResponse,
22
- Net::HTTPHeaderSyntaxError,
23
- Net::ProtocolError,
24
- SocketError,
25
- Zlib::GzipFile::Error,
26
- ]
27
-
28
- NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
29
- NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
30
-
31
- def initialize(app = nil, opts = {}, &block)
32
- @cert_store = nil
33
- super(app, opts, &block)
34
- end
35
-
36
- def call(env)
37
- super
38
- with_net_http_connection(env) do |http|
39
- configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
40
- configure_request(http, env[:request])
41
-
42
- begin
43
- http_response = perform_request(http, env)
44
- rescue *NET_HTTP_EXCEPTIONS => err
45
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
46
- raise Faraday::SSLError, err
47
- else
48
- raise Error::ConnectionFailed, err
49
- end
50
- end
51
-
52
- save_response(env, http_response.code.to_i, http_response.body || '', nil, http_response.message) do |response_headers|
53
- http_response.each_header do |key, value|
54
- response_headers[key] = value
55
- end
56
- end
57
- end
58
-
59
- @app.call env
60
- rescue Timeout::Error, Errno::ETIMEDOUT => err
61
- raise Faraday::Error::TimeoutError, err
62
- end
63
-
64
- private
65
-
66
- def create_request(env)
67
- request = Net::HTTPGenericRequest.new \
68
- env[:method].to_s.upcase, # request method
69
- !!env[:body], # is there request body
70
- :head != env[:method], # is there response body
71
- env[:url].request_uri, # request uri path
72
- env[:request_headers] # request headers
73
-
74
- if env[:body].respond_to?(:read)
75
- request.body_stream = env[:body]
76
- else
77
- request.body = env[:body]
78
- end
79
- request
80
- end
81
-
82
- def perform_request(http, env)
83
- if :get == env[:method] and !env[:body]
84
- # prefer `get` to `request` because the former handles gzip (ruby 1.9)
85
- http.get env[:url].request_uri, env[:request_headers]
86
- else
87
- http.request create_request(env)
88
- end
89
- end
90
-
91
- def with_net_http_connection(env)
92
- yield net_http_connection(env)
93
- end
94
-
95
- def net_http_connection(env)
96
- if proxy = env[:request][:proxy]
97
- Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, proxy[:user], proxy[:password])
98
- else
99
- Net::HTTP
100
- end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80))
101
- end
102
-
103
- def configure_ssl(http, ssl)
104
- http.use_ssl = true
105
- http.verify_mode = ssl_verify_mode(ssl)
106
- http.cert_store = ssl_cert_store(ssl)
107
-
108
- http.cert = ssl[:client_cert] if ssl[:client_cert]
109
- http.key = ssl[:client_key] if ssl[:client_key]
110
- http.ca_file = ssl[:ca_file] if ssl[:ca_file]
111
- http.ca_path = ssl[:ca_path] if ssl[:ca_path]
112
- http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
113
- http.ssl_version = ssl[:version] if ssl[:version]
114
- http.min_version = ssl[:min_version] if ssl[:min_version]
115
- http.max_version = ssl[:max_version] if ssl[:max_version]
116
- end
117
-
118
- def configure_request(http, req)
119
- if req[:timeout]
120
- http.read_timeout = req[:timeout]
121
- http.open_timeout = req[:timeout]
122
- http.write_timeout = req[:timeout] if http.respond_to?(:write_timeout=)
123
- end
124
- http.open_timeout = req[:open_timeout] if req[:open_timeout]
125
- http.write_timeout = req[:write_timeout] if req[:write_timeout] && http.respond_to?(:write_timeout=)
126
- # Only set if Net::Http supports it, since Ruby 2.5.
127
- http.max_retries = 0 if http.respond_to?(:max_retries=)
128
-
129
- @config_block.call(http) if @config_block
130
- end
131
-
132
- def ssl_cert_store(ssl)
133
- return ssl[:cert_store] if ssl[:cert_store]
134
- return @cert_store if @cert_store
135
- # Use the default cert store by default, i.e. system ca certs
136
- @cert_store = OpenSSL::X509::Store.new
137
- @cert_store.set_default_paths
138
- @cert_store
139
- end
140
-
141
- def ssl_verify_mode(ssl)
142
- ssl[:verify_mode] || begin
143
- if ssl.fetch(:verify, true)
144
- OpenSSL::SSL::VERIFY_PEER
145
- else
146
- OpenSSL::SSL::VERIFY_NONE
147
- end
148
- end
149
- end
150
- end
151
- end
152
- end
@@ -1,68 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class NetHttpPersistent < NetHttp
4
- dependency 'net/http/persistent'
5
-
6
- private
7
-
8
- def net_http_connection(env)
9
- @cached_connection ||=
10
- if Net::HTTP::Persistent.instance_method(:initialize).parameters.first == [:key, :name]
11
- options = {name: 'Faraday'}
12
- options[:pool_size] = @connection_options[:pool_size] if @connection_options.key?(:pool_size)
13
- Net::HTTP::Persistent.new(options)
14
- else
15
- Net::HTTP::Persistent.new('Faraday')
16
- end
17
-
18
- proxy_uri = proxy_uri(env)
19
- @cached_connection.proxy = proxy_uri if @cached_connection.proxy_uri != proxy_uri
20
- @cached_connection
21
- end
22
-
23
- def proxy_uri(env)
24
- proxy_uri = nil
25
- if (proxy = env[:request][:proxy])
26
- proxy_uri = ::URI::HTTP === proxy[:uri] ? proxy[:uri].dup : ::URI.parse(proxy[:uri].to_s)
27
- proxy_uri.user = proxy_uri.password = nil
28
- # awful patch for net-http-persistent 2.8 not unescaping user/password
29
- (class << proxy_uri; self; end).class_eval do
30
- define_method(:user) { proxy[:user] }
31
- define_method(:password) { proxy[:password] }
32
- end if proxy[:user]
33
- end
34
- proxy_uri
35
- end
36
-
37
- def perform_request(http, env)
38
- http.request env[:url], create_request(env)
39
- rescue Errno::ETIMEDOUT => error
40
- raise Faraday::Error::TimeoutError, error
41
- rescue Net::HTTP::Persistent::Error => error
42
- if error.message.include? 'Timeout'
43
- raise Faraday::Error::TimeoutError, error
44
- elsif error.message.include? 'connection refused'
45
- raise Faraday::Error::ConnectionFailed, error
46
- else
47
- raise
48
- end
49
- end
50
-
51
- def configure_ssl(http, ssl)
52
- http_set(http, :verify_mode, ssl_verify_mode(ssl))
53
- http_set(http, :cert_store, ssl_cert_store(ssl))
54
-
55
- http_set(http, :certificate, ssl[:client_cert]) if ssl[:client_cert]
56
- http_set(http, :private_key, ssl[:client_key]) if ssl[:client_key]
57
- http_set(http, :ca_file, ssl[:ca_file]) if ssl[:ca_file]
58
- http_set(http, :ssl_version, ssl[:version]) if ssl[:version]
59
- end
60
-
61
- def http_set(http, attr, value)
62
- if http.send(attr) != value
63
- http.send("#{attr}=", value)
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,95 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class Patron < Faraday::Adapter
4
- dependency 'patron'
5
-
6
- def call(env)
7
- super
8
- # TODO: support streaming requests
9
- env[:body] = env[:body].read if env[:body].respond_to? :read
10
-
11
- session = ::Patron::Session.new
12
- @config_block.call(session) if @config_block
13
- configure_ssl(session, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
14
-
15
- if req = env[:request]
16
- session.timeout = session.connect_timeout = req[:timeout] if req[:timeout]
17
- session.connect_timeout = req[:open_timeout] if req[:open_timeout]
18
-
19
- if proxy = req[:proxy]
20
- proxy_uri = proxy[:uri].dup
21
- proxy_uri.user = proxy[:user] && Utils.escape(proxy[:user]).gsub('+', '%20')
22
- proxy_uri.password = proxy[:password] && Utils.escape(proxy[:password]).gsub('+', '%20')
23
- session.proxy = proxy_uri.to_s
24
- end
25
- end
26
-
27
- response = begin
28
- data = env[:body] ? env[:body].to_s : nil
29
- session.request(env[:method], env[:url].to_s, env[:request_headers], :data => data)
30
- rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed
31
- raise Error::ConnectionFailed, $!
32
- end
33
-
34
- # Remove the "HTTP/1.1 200", leaving just the reason phrase
35
- reason_phrase = response.status_line.gsub(/^.* \d{3} /, '')
36
-
37
- save_response(env, response.status, response.body, response.headers, reason_phrase)
38
-
39
- @app.call env
40
- rescue ::Patron::TimeoutError => err
41
- if connection_timed_out_message?(err.message)
42
- raise Faraday::Error::ConnectionFailed, err
43
- else
44
- raise Faraday::Error::TimeoutError, err
45
- end
46
- rescue ::Patron::Error => err
47
- if err.message.include?("code 407")
48
- raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
49
- else
50
- raise Error::ConnectionFailed, err
51
- end
52
- end
53
-
54
- if loaded? && defined?(::Patron::Request::VALID_ACTIONS)
55
- # HAX: helps but doesn't work completely
56
- # https://github.com/toland/patron/issues/34
57
- ::Patron::Request::VALID_ACTIONS.tap do |actions|
58
- if actions[0].is_a?(Symbol)
59
- actions << :patch unless actions.include? :patch
60
- actions << :options unless actions.include? :options
61
- else
62
- # Patron 0.4.20 and up
63
- actions << "PATCH" unless actions.include? "PATCH"
64
- actions << "OPTIONS" unless actions.include? "OPTIONS"
65
- end
66
- end
67
- end
68
-
69
- def configure_ssl(session, ssl)
70
- if ssl.fetch(:verify, true)
71
- session.cacert = ssl[:ca_file]
72
- else
73
- session.insecure = true
74
- end
75
- end
76
-
77
- private
78
-
79
- CURL_TIMEOUT_MESSAGES = [ "Connection time-out",
80
- "Connection timed out",
81
- "Timed out before name resolve",
82
- "server connect has timed out",
83
- "Resolving timed out",
84
- "name lookup timed out",
85
- "timed out before SSL",
86
- "connect() timed out"
87
- ].freeze
88
-
89
- def connection_timed_out_message?(message)
90
- CURL_TIMEOUT_MESSAGES.any? { |curl_message| message.include?(curl_message) }
91
- end
92
-
93
- end
94
- end
95
- end