faraday 0.17.4 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +156 -8
  3. data/LICENSE.md +1 -1
  4. data/README.md +16 -358
  5. data/Rakefile +1 -7
  6. data/examples/client_spec.rb +97 -0
  7. data/examples/client_test.rb +118 -0
  8. data/lib/faraday/adapter/test.rb +118 -69
  9. data/lib/faraday/adapter/typhoeus.rb +4 -1
  10. data/lib/faraday/adapter.rb +72 -22
  11. data/lib/faraday/adapter_registry.rb +30 -0
  12. data/lib/faraday/autoload.rb +39 -36
  13. data/lib/faraday/connection.rb +343 -185
  14. data/lib/faraday/dependency_loader.rb +37 -0
  15. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  16. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  17. data/lib/faraday/error.rb +29 -35
  18. data/lib/faraday/file_part.rb +128 -0
  19. data/lib/faraday/logging/formatter.rb +105 -0
  20. data/lib/faraday/methods.rb +6 -0
  21. data/lib/faraday/middleware.rb +19 -25
  22. data/lib/faraday/middleware_registry.rb +129 -0
  23. data/lib/faraday/options/connection_options.rb +22 -0
  24. data/lib/faraday/options/env.rb +181 -0
  25. data/lib/faraday/options/proxy_options.rb +32 -0
  26. data/lib/faraday/options/request_options.rb +22 -0
  27. data/lib/faraday/options/ssl_options.rb +59 -0
  28. data/lib/faraday/options.rb +36 -191
  29. data/lib/faraday/param_part.rb +53 -0
  30. data/lib/faraday/parameters.rb +4 -197
  31. data/lib/faraday/rack_builder.rb +76 -64
  32. data/lib/faraday/request/authorization.rb +51 -30
  33. data/lib/faraday/request/basic_authentication.rb +14 -7
  34. data/lib/faraday/request/instrumentation.rb +45 -27
  35. data/lib/faraday/request/multipart.rb +86 -48
  36. data/lib/faraday/request/retry.rb +197 -171
  37. data/lib/faraday/request/token_authentication.rb +15 -10
  38. data/lib/faraday/request/url_encoded.rb +43 -23
  39. data/lib/faraday/request.rb +86 -44
  40. data/lib/faraday/response/logger.rb +22 -69
  41. data/lib/faraday/response/raise_error.rb +49 -18
  42. data/lib/faraday/response.rb +24 -20
  43. data/lib/faraday/utils/headers.rb +139 -0
  44. data/lib/faraday/utils/params_hash.rb +61 -0
  45. data/lib/faraday/utils.rb +38 -247
  46. data/lib/faraday/version.rb +5 -0
  47. data/lib/faraday.rb +127 -189
  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 +377 -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 +12 -54
  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 +96 -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 +78 -15
  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 +63 -36
  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 +194 -48
  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/parallel_manager.rb +0 -66
  97. data/lib/faraday/adapter/em_synchrony.rb +0 -106
  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 -153
  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/deprecate.rb +0 -109
  105. data/lib/faraday/upload_io.rb +0 -67
  106. data/spec/faraday/deprecate_spec.rb +0 -147
  107. data/test/adapters/default_test.rb +0 -14
  108. data/test/adapters/em_http_test.rb +0 -30
  109. data/test/adapters/em_synchrony_test.rb +0 -32
  110. data/test/adapters/excon_test.rb +0 -30
  111. data/test/adapters/httpclient_test.rb +0 -34
  112. data/test/adapters/integration.rb +0 -263
  113. data/test/adapters/logger_test.rb +0 -136
  114. data/test/adapters/net_http_persistent_test.rb +0 -114
  115. data/test/adapters/net_http_test.rb +0 -79
  116. data/test/adapters/patron_test.rb +0 -40
  117. data/test/adapters/rack_test.rb +0 -38
  118. data/test/adapters/test_middleware_test.rb +0 -157
  119. data/test/adapters/typhoeus_test.rb +0 -38
  120. data/test/authentication_middleware_test.rb +0 -65
  121. data/test/composite_read_io_test.rb +0 -109
  122. data/test/connection_test.rb +0 -738
  123. data/test/env_test.rb +0 -268
  124. data/test/helper.rb +0 -75
  125. data/test/live_server.rb +0 -67
  126. data/test/middleware/instrumentation_test.rb +0 -88
  127. data/test/middleware/retry_test.rb +0 -282
  128. data/test/middleware_stack_test.rb +0 -260
  129. data/test/multibyte.txt +0 -1
  130. data/test/options_test.rb +0 -333
  131. data/test/parameters_test.rb +0 -157
  132. data/test/request_middleware_test.rb +0 -126
  133. data/test/response_middleware_test.rb +0 -72
  134. data/test/strawberry.rb +0 -2
  135. data/test/utils_test.rb +0 -98
@@ -1,37 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Faraday
4
+ # Middleware is the basic base class of any Faraday middleware.
2
5
  class Middleware
3
6
  extend MiddlewareRegistry
7
+ extend DependencyLoader
4
8
 
5
- class << self
6
- attr_accessor :load_error
7
- private :load_error=
8
- end
9
-
10
- self.load_error = nil
11
-
12
- # Executes a block which should try to require and reference dependent libraries
13
- def self.dependency(lib = nil)
14
- lib ? require(lib) : yield
15
- rescue LoadError, NameError => error
16
- self.load_error = error
17
- end
9
+ attr_reader :app, :options
18
10
 
19
- def self.new(*)
20
- raise "missing dependency for #{self}: #{load_error.message}" unless loaded?
21
- super
22
- end
23
-
24
- def self.loaded?
25
- load_error.nil?
11
+ def initialize(app = nil, options = {})
12
+ @app = app
13
+ @options = options
26
14
  end
27
15
 
28
- def self.inherited(subclass)
29
- super
30
- subclass.send(:load_error=, self.load_error)
16
+ def call(env)
17
+ on_request(env) if respond_to?(:on_request)
18
+ app.call(env).on_complete do |environment|
19
+ on_complete(environment) if respond_to?(:on_complete)
20
+ end
31
21
  end
32
22
 
33
- def initialize(app = nil)
34
- @app = app
23
+ def close
24
+ if app.respond_to?(:close)
25
+ app.close
26
+ else
27
+ warn "#{app} does not implement \#close!"
28
+ end
35
29
  end
36
30
  end
37
31
  end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'monitor'
4
+
5
+ module Faraday
6
+ # Adds the ability for other modules to register and lookup
7
+ # middleware classes.
8
+ module MiddlewareRegistry
9
+ # Register middleware class(es) on the current module.
10
+ #
11
+ # @param autoload_path [String] Middleware autoload path
12
+ # @param mapping [Hash{
13
+ # Symbol => Module,
14
+ # Symbol => Array<Module, Symbol, String>,
15
+ # }] Middleware mapping from a lookup symbol to a reference to the
16
+ # middleware.
17
+ # Classes can be expressed as:
18
+ # - a fully qualified constant
19
+ # - a Symbol
20
+ # - a Proc that will be lazily called to return the former
21
+ # - an array is given, its first element is the constant or symbol,
22
+ # and its second is a file to `require`.
23
+ # @return [void]
24
+ #
25
+ # @example Lookup by a constant
26
+ #
27
+ # module Faraday
28
+ # class Whatever
29
+ # # Middleware looked up by :foo returns Faraday::Whatever::Foo.
30
+ # register_middleware foo: Foo
31
+ # end
32
+ # end
33
+ #
34
+ # @example Lookup by a symbol
35
+ #
36
+ # module Faraday
37
+ # class Whatever
38
+ # # Middleware looked up by :bar returns
39
+ # # Faraday::Whatever.const_get(:Bar)
40
+ # register_middleware bar: :Bar
41
+ # end
42
+ # end
43
+ #
44
+ # @example Lookup by a symbol and string in an array
45
+ #
46
+ # module Faraday
47
+ # class Whatever
48
+ # # Middleware looked up by :baz requires 'baz' and returns
49
+ # # Faraday::Whatever.const_get(:Baz)
50
+ # register_middleware baz: [:Baz, 'baz']
51
+ # end
52
+ # end
53
+ #
54
+ def register_middleware(autoload_path = nil, mapping = nil)
55
+ if mapping.nil?
56
+ mapping = autoload_path
57
+ autoload_path = nil
58
+ end
59
+ middleware_mutex do
60
+ @middleware_autoload_path = autoload_path if autoload_path
61
+ (@registered_middleware ||= {}).update(mapping)
62
+ end
63
+ end
64
+
65
+ # Unregister a previously registered middleware class.
66
+ #
67
+ # @param key [Symbol] key for the registered middleware.
68
+ def unregister_middleware(key)
69
+ @registered_middleware.delete(key)
70
+ end
71
+
72
+ # Lookup middleware class with a registered Symbol shortcut.
73
+ #
74
+ # @param key [Symbol] key for the registered middleware.
75
+ # @return [Class] a middleware Class.
76
+ # @raise [Faraday::Error] if given key is not registered
77
+ #
78
+ # @example
79
+ #
80
+ # module Faraday
81
+ # class Whatever
82
+ # register_middleware foo: Foo
83
+ # end
84
+ # end
85
+ #
86
+ # Faraday::Whatever.lookup_middleware(:foo)
87
+ # # => Faraday::Whatever::Foo
88
+ #
89
+ def lookup_middleware(key)
90
+ load_middleware(key) ||
91
+ raise(Faraday::Error, "#{key.inspect} is not registered on #{self}")
92
+ end
93
+
94
+ def middleware_mutex(&block)
95
+ @middleware_mutex ||= Monitor.new
96
+ @middleware_mutex.synchronize(&block)
97
+ end
98
+
99
+ def fetch_middleware(key)
100
+ defined?(@registered_middleware) && @registered_middleware[key]
101
+ end
102
+
103
+ def load_middleware(key)
104
+ value = fetch_middleware(key)
105
+ case value
106
+ when Module
107
+ value
108
+ when Symbol, String
109
+ middleware_mutex do
110
+ @registered_middleware[key] = const_get(value)
111
+ end
112
+ when Proc
113
+ middleware_mutex do
114
+ @registered_middleware[key] = value.call
115
+ end
116
+ when Array
117
+ middleware_mutex do
118
+ const, path = value
119
+ if (root = @middleware_autoload_path)
120
+ path = "#{root}/#{path}"
121
+ end
122
+ require(path)
123
+ @registered_middleware[key] = const
124
+ end
125
+ load_middleware(key)
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ # ConnectionOptions contains the configurable properties for a Faraday
5
+ # connection object.
6
+ class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url,
7
+ :parallel_manager, :params, :headers,
8
+ :builder_class)
9
+
10
+ options request: RequestOptions, ssl: SSLOptions
11
+
12
+ memoized(:request) { self.class.options_for(:request).new }
13
+
14
+ memoized(:ssl) { self.class.options_for(:ssl).new }
15
+
16
+ memoized(:builder_class) { RackBuilder }
17
+
18
+ def new_builder(block)
19
+ builder_class.new(&block)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ # @!attribute method
5
+ # @return [Symbol] HTTP method (`:get`, `:post`)
6
+ #
7
+ # @!attribute body
8
+ # @return [String] The request body that will eventually be converted to a
9
+ # string.
10
+ #
11
+ # @!attribute url
12
+ # @return [URI] URI instance for the current request.
13
+ #
14
+ # @!attribute request
15
+ # @return [Hash] options for configuring the request.
16
+ # Options for configuring the request.
17
+ #
18
+ # - `:timeout` open/read timeout Integer in seconds
19
+ # - `:open_timeout` - read timeout Integer in seconds
20
+ # - `:on_data` - Proc for streaming
21
+ # - `:proxy` - Hash of proxy options
22
+ # - `:uri` - Proxy Server URI
23
+ # - `:user` - Proxy server username
24
+ # - `:password` - Proxy server password
25
+ #
26
+ # @!attribute request_headers
27
+ # @return [Hash] HTTP Headers to be sent to the server.
28
+ #
29
+ # @!attribute ssl
30
+ # @return [Hash] options for configuring SSL requests
31
+ #
32
+ # @!attribute parallel_manager
33
+ # @return [Object] sent if the connection is in parallel mode
34
+ #
35
+ # @!attribute params
36
+ # @return [Hash]
37
+ #
38
+ # @!attribute response
39
+ # @return [Response]
40
+ #
41
+ # @!attribute response_headers
42
+ # @return [Hash] HTTP headers from the server
43
+ #
44
+ # @!attribute status
45
+ # @return [Integer] HTTP response status code
46
+ #
47
+ # @!attribute reason_phrase
48
+ # @return [String]
49
+ class Env < Options.new(:method, :request_body, :url, :request,
50
+ :request_headers, :ssl, :parallel_manager, :params,
51
+ :response, :response_headers, :status,
52
+ :reason_phrase, :response_body)
53
+
54
+ # rubocop:disable Naming/ConstantName
55
+ ContentLength = 'Content-Length'
56
+ StatusesWithoutBody = Set.new [204, 304]
57
+ SuccessfulStatuses = (200..299).freeze
58
+ # rubocop:enable Naming/ConstantName
59
+
60
+ # A Set of HTTP verbs that typically send a body. If no body is set for
61
+ # these requests, the Content-Length header is set to 0.
62
+ MethodsWithBodies = Set.new(Faraday::METHODS_WITH_BODY.map(&:to_sym))
63
+
64
+ options request: RequestOptions,
65
+ request_headers: Utils::Headers, response_headers: Utils::Headers
66
+
67
+ extend Forwardable
68
+
69
+ def_delegators :request, :params_encoder
70
+
71
+ # Build a new Env from given value. Respects and updates `custom_members`.
72
+ #
73
+ # @param value [Object] a value fitting Option.from(v).
74
+ # @return [Env] from given value
75
+ def self.from(value)
76
+ env = super(value)
77
+ if value.respond_to?(:custom_members)
78
+ env.custom_members.update(value.custom_members)
79
+ end
80
+ env
81
+ end
82
+
83
+ # @param key [Object]
84
+ def [](key)
85
+ return self[current_body] if key == :body
86
+
87
+ if in_member_set?(key)
88
+ super(key)
89
+ else
90
+ custom_members[key]
91
+ end
92
+ end
93
+
94
+ # @param key [Object]
95
+ # @param value [Object]
96
+ def []=(key, value)
97
+ if key == :body
98
+ super(current_body, value)
99
+ return
100
+ end
101
+
102
+ if in_member_set?(key)
103
+ super(key, value)
104
+ else
105
+ custom_members[key] = value
106
+ end
107
+ end
108
+
109
+ def current_body
110
+ !!status ? :response_body : :request_body
111
+ end
112
+
113
+ def body
114
+ self[:body]
115
+ end
116
+
117
+ def body=(value)
118
+ self[:body] = value
119
+ end
120
+
121
+ # @return [Boolean] true if status is in the set of {SuccessfulStatuses}.
122
+ def success?
123
+ SuccessfulStatuses.include?(status)
124
+ end
125
+
126
+ # @return [Boolean] true if there's no body yet, and the method is in the
127
+ # set of {MethodsWithBodies}.
128
+ def needs_body?
129
+ !body && MethodsWithBodies.include?(method)
130
+ end
131
+
132
+ # Sets content length to zero and the body to the empty string.
133
+ def clear_body
134
+ request_headers[ContentLength] = '0'
135
+ self.body = +''
136
+ end
137
+
138
+ # @return [Boolean] true if the status isn't in the set of
139
+ # {StatusesWithoutBody}.
140
+ def parse_body?
141
+ !StatusesWithoutBody.include?(status)
142
+ end
143
+
144
+ # @return [Boolean] true if there is a parallel_manager
145
+ def parallel?
146
+ !!parallel_manager
147
+ end
148
+
149
+ def inspect
150
+ attrs = [nil]
151
+ members.each do |mem|
152
+ if (value = send(mem))
153
+ attrs << "@#{mem}=#{value.inspect}"
154
+ end
155
+ end
156
+ attrs << "@custom=#{custom_members.inspect}" unless custom_members.empty?
157
+ %(#<#{self.class}#{attrs.join(' ')}>)
158
+ end
159
+
160
+ # @private
161
+ def custom_members
162
+ @custom_members ||= {}
163
+ end
164
+
165
+ # @private
166
+ if members.first.is_a?(Symbol)
167
+ def in_member_set?(key)
168
+ self.class.member_set.include?(key.to_sym)
169
+ end
170
+ else
171
+ def in_member_set?(key)
172
+ self.class.member_set.include?(key.to_s)
173
+ end
174
+ end
175
+
176
+ # @private
177
+ def self.member_set
178
+ @member_set ||= Set.new(members)
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ # ProxyOptions contains the configurable properties for the proxy
5
+ # configuration used when making an HTTP request.
6
+ class ProxyOptions < Options.new(:uri, :user, :password)
7
+ extend Forwardable
8
+ def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=,
9
+ :path, :path=
10
+
11
+ def self.from(value)
12
+ case value
13
+ when String
14
+ # URIs without a scheme should default to http (like 'example:123').
15
+ # This fixes #1282 and prevents a silent failure in some adapters.
16
+ value = "http://#{value}" unless value.include?('://')
17
+ value = { uri: Utils.URI(value) }
18
+ when URI
19
+ value = { uri: value }
20
+ when Hash, Options
21
+ if (uri = value.delete(:uri))
22
+ value[:uri] = Utils.URI(uri)
23
+ end
24
+ end
25
+
26
+ super(value)
27
+ end
28
+
29
+ memoized(:user) { uri&.user && Utils.unescape(uri.user) }
30
+ memoized(:password) { uri&.password && Utils.unescape(uri.password) }
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ # RequestOptions contains the configurable properties for a Faraday request.
5
+ class RequestOptions < Options.new(:params_encoder, :proxy, :bind,
6
+ :timeout, :open_timeout, :read_timeout,
7
+ :write_timeout, :boundary, :oauth,
8
+ :context, :on_data)
9
+
10
+ def []=(key, value)
11
+ if key && key.to_sym == :proxy
12
+ super(key, value ? ProxyOptions.from(value) : nil)
13
+ else
14
+ super(key, value)
15
+ end
16
+ end
17
+
18
+ def stream_response?
19
+ on_data.is_a?(Proc)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ # SSL-related options.
5
+ #
6
+ # @!attribute verify
7
+ # @return [Boolean] whether to verify SSL certificates or not
8
+ #
9
+ # @!attribute ca_file
10
+ # @return [String] CA file
11
+ #
12
+ # @!attribute ca_path
13
+ # @return [String] CA path
14
+ #
15
+ # @!attribute verify_mode
16
+ # @return [Integer] Any `OpenSSL::SSL::` constant (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL.html)
17
+ #
18
+ # @!attribute cert_store
19
+ # @return [OpenSSL::X509::Store] certificate store
20
+ #
21
+ # @!attribute client_cert
22
+ # @return [String, OpenSSL::X509::Certificate] client certificate
23
+ #
24
+ # @!attribute client_key
25
+ # @return [String, OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] client key
26
+ #
27
+ # @!attribute certificate
28
+ # @return [OpenSSL::X509::Certificate] certificate (Excon only)
29
+ #
30
+ # @!attribute private_key
31
+ # @return [OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] private key (Excon only)
32
+ #
33
+ # @!attribute verify_depth
34
+ # @return [Integer] maximum depth for the certificate chain verification
35
+ #
36
+ # @!attribute version
37
+ # @return [String, Symbol] SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-ssl_version-3D)
38
+ #
39
+ # @!attribute min_version
40
+ # @return [String, Symbol] minimum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-min_version-3D)
41
+ #
42
+ # @!attribute max_version
43
+ # @return [String, Symbol] maximum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-max_version-3D)
44
+ class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode,
45
+ :cert_store, :client_cert, :client_key,
46
+ :certificate, :private_key, :verify_depth,
47
+ :version, :min_version, :max_version)
48
+
49
+ # @return [Boolean] true if should verify
50
+ def verify?
51
+ verify != false
52
+ end
53
+
54
+ # @return [Boolean] true if should not verify
55
+ def disable?
56
+ !verify?
57
+ end
58
+ end
59
+ end