faraday 0.17.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +52 -8
  3. data/LICENSE.md +1 -1
  4. data/README.md +17 -358
  5. data/Rakefile +1 -7
  6. data/examples/client_spec.rb +65 -0
  7. data/examples/client_test.rb +79 -0
  8. data/lib/faraday.rb +116 -189
  9. data/lib/faraday/adapter.rb +83 -22
  10. data/lib/faraday/adapter/em_http.rb +148 -102
  11. data/lib/faraday/adapter/em_http_ssl_patch.rb +24 -18
  12. data/lib/faraday/adapter/em_synchrony.rb +110 -63
  13. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +18 -15
  14. data/lib/faraday/adapter/excon.rb +98 -56
  15. data/lib/faraday/adapter/httpclient.rb +83 -59
  16. data/lib/faraday/adapter/net_http.rb +137 -69
  17. data/lib/faraday/adapter/net_http_persistent.rb +50 -27
  18. data/lib/faraday/adapter/patron.rb +80 -43
  19. data/lib/faraday/adapter/rack.rb +30 -13
  20. data/lib/faraday/adapter/test.rb +86 -53
  21. data/lib/faraday/adapter/typhoeus.rb +4 -1
  22. data/lib/faraday/adapter_registry.rb +30 -0
  23. data/lib/faraday/autoload.rb +47 -36
  24. data/lib/faraday/connection.rb +312 -182
  25. data/lib/faraday/dependency_loader.rb +37 -0
  26. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  27. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  28. data/lib/faraday/error.rb +17 -35
  29. data/lib/faraday/file_part.rb +128 -0
  30. data/lib/faraday/logging/formatter.rb +105 -0
  31. data/lib/faraday/methods.rb +6 -0
  32. data/lib/faraday/middleware.rb +19 -25
  33. data/lib/faraday/middleware_registry.rb +129 -0
  34. data/lib/faraday/options.rb +36 -191
  35. data/lib/faraday/options/connection_options.rb +22 -0
  36. data/lib/faraday/options/env.rb +181 -0
  37. data/lib/faraday/options/proxy_options.rb +28 -0
  38. data/lib/faraday/options/request_options.rb +22 -0
  39. data/lib/faraday/options/ssl_options.rb +59 -0
  40. data/lib/faraday/param_part.rb +53 -0
  41. data/lib/faraday/parameters.rb +4 -197
  42. data/lib/faraday/rack_builder.rb +76 -64
  43. data/lib/faraday/request.rb +86 -44
  44. data/lib/faraday/request/authorization.rb +44 -30
  45. data/lib/faraday/request/basic_authentication.rb +14 -7
  46. data/lib/faraday/request/instrumentation.rb +45 -27
  47. data/lib/faraday/request/multipart.rb +86 -48
  48. data/lib/faraday/request/retry.rb +197 -171
  49. data/lib/faraday/request/token_authentication.rb +15 -10
  50. data/lib/faraday/request/url_encoded.rb +43 -23
  51. data/lib/faraday/response.rb +24 -20
  52. data/lib/faraday/response/logger.rb +22 -69
  53. data/lib/faraday/response/raise_error.rb +49 -18
  54. data/lib/faraday/utils.rb +38 -247
  55. data/lib/faraday/utils/headers.rb +139 -0
  56. data/lib/faraday/utils/params_hash.rb +61 -0
  57. data/lib/faraday/version.rb +5 -0
  58. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  59. data/spec/faraday/adapter/em_http_spec.rb +47 -0
  60. data/spec/faraday/adapter/em_synchrony_spec.rb +16 -0
  61. data/spec/faraday/adapter/excon_spec.rb +49 -0
  62. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  63. data/spec/faraday/adapter/net_http_persistent_spec.rb +57 -0
  64. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  65. data/spec/faraday/adapter/patron_spec.rb +18 -0
  66. data/spec/faraday/adapter/rack_spec.rb +8 -0
  67. data/spec/faraday/adapter/test_spec.rb +260 -0
  68. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  69. data/spec/faraday/adapter_registry_spec.rb +28 -0
  70. data/spec/faraday/adapter_spec.rb +55 -0
  71. data/spec/faraday/composite_read_io_spec.rb +80 -0
  72. data/spec/faraday/connection_spec.rb +691 -0
  73. data/spec/faraday/error_spec.rb +0 -57
  74. data/spec/faraday/middleware_spec.rb +52 -0
  75. data/spec/faraday/options/env_spec.rb +70 -0
  76. data/spec/faraday/options/options_spec.rb +297 -0
  77. data/spec/faraday/options/proxy_options_spec.rb +37 -0
  78. data/spec/faraday/options/request_options_spec.rb +19 -0
  79. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  80. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  81. data/spec/faraday/rack_builder_spec.rb +345 -0
  82. data/spec/faraday/request/authorization_spec.rb +88 -0
  83. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  84. data/spec/faraday/request/multipart_spec.rb +302 -0
  85. data/spec/faraday/request/retry_spec.rb +242 -0
  86. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  87. data/spec/faraday/request_spec.rb +120 -0
  88. data/spec/faraday/response/logger_spec.rb +220 -0
  89. data/spec/faraday/response/middleware_spec.rb +68 -0
  90. data/spec/faraday/response/raise_error_spec.rb +48 -15
  91. data/spec/faraday/response_spec.rb +75 -0
  92. data/spec/faraday/utils/headers_spec.rb +82 -0
  93. data/spec/faraday/utils_spec.rb +56 -0
  94. data/spec/faraday_spec.rb +37 -0
  95. data/spec/spec_helper.rb +63 -36
  96. data/spec/support/disabling_stub.rb +14 -0
  97. data/spec/support/fake_safe_buffer.rb +15 -0
  98. data/spec/support/helper_methods.rb +133 -0
  99. data/spec/support/shared_examples/adapter.rb +105 -0
  100. data/spec/support/shared_examples/params_encoder.rb +18 -0
  101. data/spec/support/shared_examples/request_method.rb +262 -0
  102. data/spec/support/streaming_response_checker.rb +35 -0
  103. data/spec/support/webmock_rack_app.rb +68 -0
  104. metadata +83 -38
  105. data/lib/faraday/deprecate.rb +0 -107
  106. data/lib/faraday/upload_io.rb +0 -67
  107. data/spec/faraday/deprecate_spec.rb +0 -69
  108. data/test/adapters/default_test.rb +0 -14
  109. data/test/adapters/em_http_test.rb +0 -30
  110. data/test/adapters/em_synchrony_test.rb +0 -32
  111. data/test/adapters/excon_test.rb +0 -30
  112. data/test/adapters/httpclient_test.rb +0 -34
  113. data/test/adapters/integration.rb +0 -263
  114. data/test/adapters/logger_test.rb +0 -136
  115. data/test/adapters/net_http_persistent_test.rb +0 -114
  116. data/test/adapters/net_http_test.rb +0 -79
  117. data/test/adapters/patron_test.rb +0 -40
  118. data/test/adapters/rack_test.rb +0 -38
  119. data/test/adapters/test_middleware_test.rb +0 -157
  120. data/test/adapters/typhoeus_test.rb +0 -38
  121. data/test/authentication_middleware_test.rb +0 -65
  122. data/test/composite_read_io_test.rb +0 -109
  123. data/test/connection_test.rb +0 -738
  124. data/test/env_test.rb +0 -268
  125. data/test/helper.rb +0 -75
  126. data/test/live_server.rb +0 -67
  127. data/test/middleware/instrumentation_test.rb +0 -88
  128. data/test/middleware/retry_test.rb +0 -282
  129. data/test/middleware_stack_test.rb +0 -260
  130. data/test/multibyte.txt +0 -1
  131. data/test/options_test.rb +0 -333
  132. data/test/parameters_test.rb +0 -157
  133. data/test/request_middleware_test.rb +0 -126
  134. data/test/response_middleware_test.rb +0 -72
  135. data/test/strawberry.rb +0 -2
  136. data/test/utils_test.rb +0 -98
@@ -1,78 +1,97 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Faraday
2
4
  class Adapter
5
+ # HTTPClient adapter.
3
6
  class HTTPClient < Faraday::Adapter
4
7
  dependency 'httpclient'
5
8
 
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
9
+ def build_connection(env)
10
+ @client ||= ::HTTPClient.new.tap do |cli|
11
+ # enable compression
12
+ cli.transparent_gzip_decompression = true
13
+ end
15
14
 
16
- if req = env[:request]
17
- if proxy = req[:proxy]
18
- configure_proxy proxy
15
+ if (req = env[:request])
16
+ if (proxy = req[:proxy])
17
+ configure_proxy @client, proxy
19
18
  end
20
19
 
21
- if bind = req[:bind]
22
- configure_socket bind
20
+ if (bind = req[:bind])
21
+ configure_socket @client, bind
23
22
  end
24
23
 
25
- configure_timeouts req
24
+ configure_timeouts @client, req
26
25
  end
27
26
 
28
- if env[:url].scheme == 'https' && ssl = env[:ssl]
29
- configure_ssl ssl
27
+ if env[:url].scheme == 'https' && (ssl = env[:ssl])
28
+ configure_ssl @client, ssl
30
29
  end
31
30
 
32
- configure_client
31
+ configure_client @client
32
+
33
+ @client
34
+ end
33
35
 
34
- # TODO Don't stream yet.
36
+ def call(env)
37
+ super
38
+
39
+ # TODO: Don't stream yet.
35
40
  # https://github.com/nahi/httpclient/pull/90
36
41
  env[:body] = env[:body].read if env[:body].respond_to? :read
37
42
 
38
- resp = client.request env[:method], env[:url],
39
- :body => env[:body],
40
- :header => env[:request_headers]
43
+ connection(env) do |http|
44
+ resp = http.request env[:method], env[:url],
45
+ body: env[:body],
46
+ header: env[:request_headers]
41
47
 
42
- save_response env, resp.status, resp.body, resp.headers, resp.reason
48
+ if (req = env[:request]).stream_response?
49
+ warn "Streaming downloads for #{self.class.name} " \
50
+ 'are not yet implemented.'
51
+ req.on_data.call(resp.body, resp.body.bytesize)
52
+ end
53
+ save_response env, resp.status, resp.body, resp.headers, resp.reason
43
54
 
44
- @app.call env
55
+ @app.call env
56
+ end
45
57
  rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT
46
- raise Faraday::TimeoutError, $!
47
- rescue ::HTTPClient::BadResponseError => err
48
- if err.message.include?('status 407')
49
- raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
50
- else
51
- raise Faraday::ClientError, $!
58
+ raise Faraday::TimeoutError, $ERROR_INFO
59
+ rescue ::HTTPClient::BadResponseError => e
60
+ if e.message.include?('status 407')
61
+ raise Faraday::ConnectionFailed,
62
+ %(407 "Proxy Authentication Required ")
52
63
  end
53
- rescue Errno::ECONNREFUSED, IOError, SocketError
54
- raise Faraday::ConnectionFailed, $!
55
- rescue => err
56
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
57
- raise Faraday::SSLError, err
58
- else
59
- raise
64
+
65
+ raise Faraday::ClientError, $ERROR_INFO
66
+ rescue Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED, IOError, SocketError
67
+ raise Faraday::ConnectionFailed, $ERROR_INFO
68
+ rescue StandardError => e
69
+ if defined?(::OpenSSL::SSL::SSLError) && \
70
+ e.is_a?(::OpenSSL::SSL::SSLError)
71
+ raise Faraday::SSLError, e
60
72
  end
73
+
74
+ raise
61
75
  end
62
76
 
63
- def configure_socket(bind)
77
+ # @param bind [Hash]
78
+ def configure_socket(client, bind)
64
79
  client.socket_local.host = bind[:host]
65
80
  client.socket_local.port = bind[:port]
66
81
  end
67
82
 
68
- def configure_proxy(proxy)
83
+ # Configure proxy URI and any user credentials.
84
+ #
85
+ # @param proxy [Hash]
86
+ def configure_proxy(client, proxy)
69
87
  client.proxy = proxy[:uri]
70
- if proxy[:user] && proxy[:password]
71
- client.set_proxy_auth proxy[:user], proxy[:password]
72
- end
88
+ return unless proxy[:user] && proxy[:password]
89
+
90
+ client.set_proxy_auth(proxy[:user], proxy[:password])
73
91
  end
74
92
 
75
- def configure_ssl(ssl)
93
+ # @param ssl [Hash]
94
+ def configure_ssl(client, ssl)
76
95
  ssl_config = client.ssl_config
77
96
  ssl_config.verify_mode = ssl_verify_mode(ssl)
78
97
  ssl_config.cert_store = ssl_cert_store(ssl)
@@ -84,40 +103,45 @@ module Faraday
84
103
  ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
85
104
  end
86
105
 
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]
106
+ # @param req [Hash]
107
+ def configure_timeouts(client, req)
108
+ if (sec = request_timeout(:open, req))
109
+ client.connect_timeout = sec
92
110
  end
93
111
 
94
- if req[:open_timeout]
95
- client.connect_timeout = req[:open_timeout]
96
- client.send_timeout = req[:open_timeout]
112
+ if (sec = request_timeout(:write, req))
113
+ client.send_timeout = sec
97
114
  end
115
+
116
+ return unless (sec = request_timeout(:read, req))
117
+
118
+ client.receive_timeout = sec
98
119
  end
99
120
 
100
- def configure_client
101
- @config_block.call(client) if @config_block
121
+ def configure_client(client)
122
+ @config_block&.call(client)
102
123
  end
103
124
 
125
+ # @param ssl [Hash]
126
+ # @return [OpenSSL::X509::Store]
104
127
  def ssl_cert_store(ssl)
105
128
  return ssl[:cert_store] if ssl[:cert_store]
129
+
106
130
  # Memoize the cert store so that the same one is passed to
107
- # HTTPClient each time, to avoid resyncing SSL sesions when
131
+ # HTTPClient each time, to avoid resyncing SSL sessions when
108
132
  # it's changed
109
- @cert_store ||= begin
133
+ @ssl_cert_store ||= begin
110
134
  # 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
135
+ OpenSSL::X509::Store.new.tap(&:set_default_paths)
114
136
  end
115
137
  end
116
138
 
139
+ # @param ssl [Hash]
117
140
  def ssl_verify_mode(ssl)
118
141
  ssl[:verify_mode] || begin
119
142
  if ssl.fetch(:verify, true)
120
- OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
143
+ OpenSSL::SSL::VERIFY_PEER |
144
+ OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
121
145
  else
122
146
  OpenSSL::SSL::VERIFY_NONE
123
147
  end
@@ -1,16 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'net/https'
3
5
  rescue LoadError
4
- warn "Warning: no such file to load -- net/https. Make sure openssl is installed if you want ssl support"
6
+ warn 'Warning: no such file to load -- net/https. ' \
7
+ 'Make sure openssl is installed if you want ssl support'
5
8
  require 'net/http'
6
9
  end
7
10
  require 'zlib'
8
11
 
9
12
  module Faraday
10
13
  class Adapter
14
+ # Net::HTTP adapter.
11
15
  class NetHttp < Faraday::Adapter
12
- NET_HTTP_EXCEPTIONS = [
16
+ exceptions = [
13
17
  IOError,
18
+ Errno::EADDRNOTAVAIL,
14
19
  Errno::ECONNABORTED,
15
20
  Errno::ECONNREFUSED,
16
21
  Errno::ECONNRESET,
@@ -22,54 +27,79 @@ module Faraday
22
27
  Net::HTTPHeaderSyntaxError,
23
28
  Net::ProtocolError,
24
29
  SocketError,
25
- Zlib::GzipFile::Error,
30
+ Zlib::GzipFile::Error
26
31
  ]
27
32
 
28
- NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
29
- NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
33
+ if defined?(::OpenSSL::SSL::SSLError)
34
+ exceptions << ::OpenSSL::SSL::SSLError
35
+ end
36
+ exceptions << ::Net::OpenTimeout if defined?(::Net::OpenTimeout)
37
+
38
+ NET_HTTP_EXCEPTIONS = exceptions.freeze
30
39
 
31
40
  def initialize(app = nil, opts = {}, &block)
32
- @cert_store = nil
41
+ @ssl_cert_store = nil
33
42
  super(app, opts, &block)
34
43
  end
35
44
 
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]
45
+ def build_connection(env)
46
+ net_http_connection(env).tap do |http|
47
+ if http.respond_to?(:use_ssl=)
48
+ http.use_ssl = env[:url].scheme == 'https'
49
+ end
50
+ configure_ssl(http, env[:ssl])
40
51
  configure_request(http, env[:request])
52
+ end
53
+ end
41
54
 
55
+ def net_http_connection(env)
56
+ proxy = env[:request][:proxy]
57
+ port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80)
58
+ if proxy
59
+ Net::HTTP.new(env[:url].hostname, port,
60
+ proxy[:uri].hostname, proxy[:uri].port,
61
+ proxy[:user], proxy[:password])
62
+ else
63
+ Net::HTTP.new(env[:url].hostname, port, nil)
64
+ end
65
+ end
66
+
67
+ def call(env)
68
+ super
69
+ http_response = connection(env) do |http|
42
70
  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 Faraday::ConnectionFailed, err
71
+ perform_request(http, env)
72
+ rescue *NET_HTTP_EXCEPTIONS => e
73
+ if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError)
74
+ raise Faraday::SSLError, e
49
75
  end
76
+
77
+ raise Faraday::ConnectionFailed, e
50
78
  end
79
+ end
51
80
 
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
81
+ save_response(env, http_response.code.to_i,
82
+ http_response.body || +'', nil,
83
+ http_response.message) do |response_headers|
84
+ http_response.each_header do |key, value|
85
+ response_headers[key] = value
56
86
  end
57
87
  end
58
88
 
59
89
  @app.call env
60
- rescue Timeout::Error, Errno::ETIMEDOUT => err
61
- raise Faraday::TimeoutError, err
90
+ rescue Timeout::Error, Errno::ETIMEDOUT => e
91
+ raise Faraday::TimeoutError, e
62
92
  end
63
93
 
64
94
  private
65
95
 
66
96
  def create_request(env)
67
97
  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
98
+ env[:method].to_s.upcase, # request method
99
+ !!env[:body], # is there request body
100
+ env[:method] != :head, # is there response body
101
+ env[:url].request_uri, # request uri path
102
+ env[:request_headers] # request headers
73
103
 
74
104
  if env[:body].respond_to?(:read)
75
105
  request.body_stream = env[:body]
@@ -80,72 +110,110 @@ module Faraday
80
110
  end
81
111
 
82
112
  def perform_request(http, env)
83
- if :get == env[:method] and !env[:body]
113
+ if env[:request].stream_response?
114
+ size = 0
115
+ yielded = false
116
+ http_response = request_with_wrapped_block(http, env) do |chunk|
117
+ if chunk.bytesize.positive? || size.positive?
118
+ yielded = true
119
+ size += chunk.bytesize
120
+ env[:request].on_data.call(chunk, size)
121
+ end
122
+ end
123
+ env[:request].on_data.call(+'', 0) unless yielded
124
+ # Net::HTTP returns something,
125
+ # but it's not meaningful according to the docs.
126
+ http_response.body = nil
127
+ http_response
128
+ else
129
+ request_with_wrapped_block(http, env)
130
+ end
131
+ end
132
+
133
+ def request_with_wrapped_block(http, env, &block)
134
+ if (env[:method] == :get) && !env[:body]
84
135
  # prefer `get` to `request` because the former handles gzip (ruby 1.9)
85
- http.get env[:url].request_uri, env[:request_headers]
136
+ request_via_get_method(http, env, &block)
86
137
  else
87
- http.request create_request(env)
138
+ request_via_request_method(http, env, &block)
88
139
  end
89
140
  end
90
141
 
91
- def with_net_http_connection(env)
92
- yield net_http_connection(env)
142
+ def request_via_get_method(http, env, &block)
143
+ # Must use Net::HTTP#start and pass it a block otherwise the server's
144
+ # TCP socket does not close correctly.
145
+ http.start do |opened_http|
146
+ opened_http.get env[:url].request_uri, env[:request_headers], &block
147
+ end
93
148
  end
94
149
 
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))
150
+ def request_via_request_method(http, env, &block)
151
+ # Must use Net::HTTP#start and pass it a block otherwise the server's
152
+ # TCP socket does not close correctly.
153
+ http.start do |opened_http|
154
+ if block_given?
155
+ opened_http.request create_request(env) do |response|
156
+ response.read_body(&block)
157
+ end
158
+ else
159
+ opened_http.request create_request(env)
160
+ end
161
+ end
101
162
  end
102
163
 
103
164
  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]
165
+ return unless ssl
166
+
167
+ http.verify_mode = ssl_verify_mode(ssl)
168
+ http.cert_store = ssl_cert_store(ssl)
169
+
170
+ http.cert = ssl[:client_cert] if ssl[:client_cert]
171
+ http.key = ssl[:client_key] if ssl[:client_key]
172
+ http.ca_file = ssl[:ca_file] if ssl[:ca_file]
173
+ http.ca_path = ssl[:ca_path] if ssl[:ca_path]
112
174
  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]
175
+ http.ssl_version = ssl[:version] if ssl[:version]
176
+ http.min_version = ssl[:min_version] if ssl[:min_version]
177
+ http.max_version = ssl[:max_version] if ssl[:max_version]
116
178
  end
117
179
 
118
180
  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=)
181
+ if (sec = request_timeout(:read, req))
182
+ http.read_timeout = sec
183
+ end
184
+
185
+ if (sec = http.respond_to?(:write_timeout=) &&
186
+ request_timeout(:write, req))
187
+ http.write_timeout = sec
188
+ end
189
+
190
+ if (sec = request_timeout(:open, req))
191
+ http.open_timeout = sec
123
192
  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
193
 
129
- @config_block.call(http) if @config_block
194
+ # Only set if Net::Http supports it, since Ruby 2.5.
195
+ http.max_retries = 0 if http.respond_to?(:max_retries=)
196
+
197
+ @config_block&.call(http)
130
198
  end
131
199
 
132
200
  def ssl_cert_store(ssl)
133
201
  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
202
+
203
+ @ssl_cert_store ||= begin
204
+ # Use the default cert store by default, i.e. system ca certs
205
+ OpenSSL::X509::Store.new.tap(&:set_default_paths)
206
+ end
139
207
  end
140
208
 
141
209
  def ssl_verify_mode(ssl)
142
210
  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
211
+ if ssl.fetch(:verify, true)
212
+ OpenSSL::SSL::VERIFY_PEER
213
+ else
214
+ OpenSSL::SSL::VERIFY_NONE
215
+ end
216
+ end
149
217
  end
150
218
  end
151
219
  end