faraday 0.17.3 → 2.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +350 -8
  3. data/LICENSE.md +1 -1
  4. data/README.md +27 -367
  5. data/Rakefile +1 -7
  6. data/examples/client_spec.rb +119 -0
  7. data/examples/client_test.rb +144 -0
  8. data/lib/faraday/adapter/test.rb +170 -72
  9. data/lib/faraday/adapter.rb +69 -23
  10. data/lib/faraday/adapter_registry.rb +30 -0
  11. data/lib/faraday/connection.rb +309 -233
  12. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  13. data/lib/faraday/encoders/nested_params_encoder.rb +183 -0
  14. data/lib/faraday/error.rb +31 -42
  15. data/lib/faraday/logging/formatter.rb +122 -0
  16. data/lib/faraday/methods.rb +6 -0
  17. data/lib/faraday/middleware.rb +21 -25
  18. data/lib/faraday/middleware_registry.rb +83 -0
  19. data/lib/faraday/options/connection_options.rb +22 -0
  20. data/lib/faraday/options/env.rb +205 -0
  21. data/lib/faraday/options/proxy_options.rb +32 -0
  22. data/lib/faraday/options/request_options.rb +22 -0
  23. data/lib/faraday/options/ssl_options.rb +69 -0
  24. data/lib/faraday/options.rb +38 -193
  25. data/lib/faraday/parameters.rb +4 -197
  26. data/lib/faraday/rack_builder.rb +91 -76
  27. data/lib/faraday/request/authorization.rb +42 -29
  28. data/lib/faraday/request/instrumentation.rb +47 -27
  29. data/lib/faraday/request/json.rb +55 -0
  30. data/lib/faraday/request/url_encoded.rb +48 -24
  31. data/lib/faraday/request.rb +64 -42
  32. data/lib/faraday/response/json.rb +54 -0
  33. data/lib/faraday/response/logger.rb +24 -67
  34. data/lib/faraday/response/raise_error.rb +57 -18
  35. data/lib/faraday/response.rb +26 -32
  36. data/lib/faraday/utils/headers.rb +144 -0
  37. data/lib/faraday/utils/params_hash.rb +61 -0
  38. data/lib/faraday/utils.rb +47 -251
  39. data/lib/faraday/version.rb +5 -0
  40. data/lib/faraday.rb +108 -198
  41. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  42. data/spec/faraday/adapter/test_spec.rb +442 -0
  43. data/spec/faraday/adapter_registry_spec.rb +28 -0
  44. data/spec/faraday/adapter_spec.rb +55 -0
  45. data/spec/faraday/connection_spec.rb +808 -0
  46. data/spec/faraday/error_spec.rb +12 -54
  47. data/spec/faraday/middleware_registry_spec.rb +31 -0
  48. data/spec/faraday/middleware_spec.rb +70 -0
  49. data/spec/faraday/options/env_spec.rb +76 -0
  50. data/spec/faraday/options/options_spec.rb +297 -0
  51. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  52. data/spec/faraday/options/request_options_spec.rb +19 -0
  53. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  54. data/spec/faraday/params_encoders/nested_spec.rb +150 -0
  55. data/spec/faraday/rack_builder_spec.rb +317 -0
  56. data/spec/faraday/request/authorization_spec.rb +118 -0
  57. data/spec/faraday/request/instrumentation_spec.rb +74 -0
  58. data/spec/faraday/request/json_spec.rb +111 -0
  59. data/spec/faraday/request/url_encoded_spec.rb +93 -0
  60. data/spec/faraday/request_spec.rb +110 -0
  61. data/spec/faraday/response/json_spec.rb +117 -0
  62. data/spec/faraday/response/logger_spec.rb +248 -0
  63. data/spec/faraday/response/raise_error_spec.rb +81 -15
  64. data/spec/faraday/response_spec.rb +77 -0
  65. data/spec/faraday/utils/headers_spec.rb +100 -0
  66. data/spec/faraday/utils_spec.rb +118 -0
  67. data/spec/faraday_spec.rb +37 -0
  68. data/spec/spec_helper.rb +63 -36
  69. data/spec/support/disabling_stub.rb +14 -0
  70. data/spec/support/fake_safe_buffer.rb +15 -0
  71. data/spec/support/helper_methods.rb +96 -0
  72. data/spec/support/shared_examples/adapter.rb +105 -0
  73. data/spec/support/shared_examples/params_encoder.rb +18 -0
  74. data/spec/support/shared_examples/request_method.rb +263 -0
  75. data/spec/support/streaming_response_checker.rb +35 -0
  76. metadata +76 -59
  77. data/lib/faraday/adapter/em_http.rb +0 -243
  78. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  79. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  80. data/lib/faraday/adapter/em_synchrony.rb +0 -106
  81. data/lib/faraday/adapter/excon.rb +0 -82
  82. data/lib/faraday/adapter/httpclient.rb +0 -128
  83. data/lib/faraday/adapter/net_http.rb +0 -152
  84. data/lib/faraday/adapter/net_http_persistent.rb +0 -68
  85. data/lib/faraday/adapter/patron.rb +0 -95
  86. data/lib/faraday/adapter/rack.rb +0 -58
  87. data/lib/faraday/adapter/typhoeus.rb +0 -12
  88. data/lib/faraday/autoload.rb +0 -84
  89. data/lib/faraday/deprecate.rb +0 -107
  90. data/lib/faraday/request/basic_authentication.rb +0 -13
  91. data/lib/faraday/request/multipart.rb +0 -68
  92. data/lib/faraday/request/retry.rb +0 -213
  93. data/lib/faraday/request/token_authentication.rb +0 -15
  94. data/lib/faraday/upload_io.rb +0 -67
  95. data/spec/faraday/deprecate_spec.rb +0 -69
  96. data/test/adapters/default_test.rb +0 -14
  97. data/test/adapters/em_http_test.rb +0 -30
  98. data/test/adapters/em_synchrony_test.rb +0 -32
  99. data/test/adapters/excon_test.rb +0 -30
  100. data/test/adapters/httpclient_test.rb +0 -34
  101. data/test/adapters/integration.rb +0 -263
  102. data/test/adapters/logger_test.rb +0 -136
  103. data/test/adapters/net_http_persistent_test.rb +0 -114
  104. data/test/adapters/net_http_test.rb +0 -79
  105. data/test/adapters/patron_test.rb +0 -40
  106. data/test/adapters/rack_test.rb +0 -38
  107. data/test/adapters/test_middleware_test.rb +0 -157
  108. data/test/adapters/typhoeus_test.rb +0 -38
  109. data/test/authentication_middleware_test.rb +0 -65
  110. data/test/composite_read_io_test.rb +0 -109
  111. data/test/connection_test.rb +0 -738
  112. data/test/env_test.rb +0 -268
  113. data/test/helper.rb +0 -75
  114. data/test/live_server.rb +0 -67
  115. data/test/middleware/instrumentation_test.rb +0 -88
  116. data/test/middleware/retry_test.rb +0 -282
  117. data/test/middleware_stack_test.rb +0 -260
  118. data/test/multibyte.txt +0 -1
  119. data/test/options_test.rb +0 -333
  120. data/test/parameters_test.rb +0 -157
  121. data/test/request_middleware_test.rb +0 -126
  122. data/test/response_middleware_test.rb +0 -72
  123. data/test/strawberry.rb +0 -2
  124. data/test/utils_test.rb +0 -98
@@ -0,0 +1,205 @@
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` - time limit for the entire request (Integer in
19
+ # seconds)
20
+ # - `:open_timeout` - time limit for just the connection phase (e.g.
21
+ # handshake) (Integer in seconds)
22
+ # - `:read_timeout` - time limit for the first response byte received from
23
+ # the server (Integer in seconds)
24
+ # - `:write_timeout` - time limit for the client to send the request to the
25
+ # server (Integer in seconds)
26
+ # - `:on_data` - Proc for streaming
27
+ # - `:proxy` - Hash of proxy options
28
+ # - `:uri` - Proxy server URI
29
+ # - `:user` - Proxy server username
30
+ # - `:password` - Proxy server password
31
+ #
32
+ # @!attribute request_headers
33
+ # @return [Hash] HTTP Headers to be sent to the server.
34
+ #
35
+ # @!attribute ssl
36
+ # @return [Hash] options for configuring SSL requests
37
+ #
38
+ # @!attribute parallel_manager
39
+ # @return [Object] sent if the connection is in parallel mode
40
+ #
41
+ # @!attribute params
42
+ # @return [Hash]
43
+ #
44
+ # @!attribute response
45
+ # @return [Response]
46
+ #
47
+ # @!attribute response_headers
48
+ # @return [Hash] HTTP headers from the server
49
+ #
50
+ # @!attribute status
51
+ # @return [Integer] HTTP response status code
52
+ #
53
+ # @!attribute reason_phrase
54
+ # @return [String]
55
+ class Env < Options.new(:method, :request_body, :url, :request,
56
+ :request_headers, :ssl, :parallel_manager, :params,
57
+ :response, :response_headers, :status,
58
+ :reason_phrase, :response_body)
59
+
60
+ # rubocop:disable Naming/ConstantName
61
+ ContentLength = 'Content-Length'
62
+ StatusesWithoutBody = Set.new [204, 304]
63
+ SuccessfulStatuses = (200..299).freeze
64
+ # rubocop:enable Naming/ConstantName
65
+
66
+ # A Set of HTTP verbs that typically send a body. If no body is set for
67
+ # these requests, the Content-Length header is set to 0.
68
+ MethodsWithBodies = Set.new(Faraday::METHODS_WITH_BODY.map(&:to_sym))
69
+
70
+ options request: RequestOptions,
71
+ request_headers: Utils::Headers, response_headers: Utils::Headers
72
+
73
+ extend Forwardable
74
+
75
+ def_delegators :request, :params_encoder
76
+
77
+ # Build a new Env from given value. Respects and updates `custom_members`.
78
+ #
79
+ # @param value [Object] a value fitting Option.from(v).
80
+ # @return [Env] from given value
81
+ def self.from(value)
82
+ env = super(value)
83
+ if value.respond_to?(:custom_members)
84
+ env.custom_members.update(value.custom_members)
85
+ end
86
+ env
87
+ end
88
+
89
+ # @param key [Object]
90
+ def [](key)
91
+ return self[current_body] if key == :body
92
+
93
+ if in_member_set?(key)
94
+ super(key)
95
+ else
96
+ custom_members[key]
97
+ end
98
+ end
99
+
100
+ # @param key [Object]
101
+ # @param value [Object]
102
+ def []=(key, value)
103
+ if key == :body
104
+ super(current_body, value)
105
+ return
106
+ end
107
+
108
+ if in_member_set?(key)
109
+ super(key, value)
110
+ else
111
+ custom_members[key] = value
112
+ end
113
+ end
114
+
115
+ def current_body
116
+ !!status ? :response_body : :request_body
117
+ end
118
+
119
+ def body
120
+ self[:body]
121
+ end
122
+
123
+ def body=(value)
124
+ self[:body] = value
125
+ end
126
+
127
+ # @return [Boolean] true if status is in the set of {SuccessfulStatuses}.
128
+ def success?
129
+ SuccessfulStatuses.include?(status)
130
+ end
131
+
132
+ # @return [Boolean] true if there's no body yet, and the method is in the
133
+ # set of {MethodsWithBodies}.
134
+ def needs_body?
135
+ !body && MethodsWithBodies.include?(method)
136
+ end
137
+
138
+ # Sets content length to zero and the body to the empty string.
139
+ def clear_body
140
+ request_headers[ContentLength] = '0'
141
+ self.body = +''
142
+ end
143
+
144
+ # @return [Boolean] true if the status isn't in the set of
145
+ # {StatusesWithoutBody}.
146
+ def parse_body?
147
+ !StatusesWithoutBody.include?(status)
148
+ end
149
+
150
+ # @return [Boolean] true if there is a parallel_manager
151
+ def parallel?
152
+ !!parallel_manager
153
+ end
154
+
155
+ def inspect
156
+ attrs = [nil]
157
+ members.each do |mem|
158
+ if (value = send(mem))
159
+ attrs << "@#{mem}=#{value.inspect}"
160
+ end
161
+ end
162
+ attrs << "@custom=#{custom_members.inspect}" unless custom_members.empty?
163
+ %(#<#{self.class}#{attrs.join(' ')}>)
164
+ end
165
+
166
+ def stream_response?
167
+ request.stream_response?
168
+ end
169
+
170
+ def stream_response(&block)
171
+ size = 0
172
+ yielded = false
173
+ block_result = block.call do |chunk| # rubocop:disable Performance/RedundantBlockCall
174
+ if chunk.bytesize.positive? || size.positive?
175
+ yielded = true
176
+ size += chunk.bytesize
177
+ request.on_data.call(chunk, size, self)
178
+ end
179
+ end
180
+ request.on_data.call(+'', 0, self) unless yielded
181
+ block_result
182
+ end
183
+
184
+ # @private
185
+ def custom_members
186
+ @custom_members ||= {}
187
+ end
188
+
189
+ # @private
190
+ if members.first.is_a?(Symbol)
191
+ def in_member_set?(key)
192
+ self.class.member_set.include?(key.to_sym)
193
+ end
194
+ else
195
+ def in_member_set?(key)
196
+ self.class.member_set.include?(key.to_s)
197
+ end
198
+ end
199
+
200
+ # @private
201
+ def self.member_set
202
+ @member_set ||= Set.new(members)
203
+ end
204
+ end
205
+ 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,69 @@
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 verify_hostname
10
+ # @return [Boolean] whether to enable hostname verification on server certificates
11
+ # during the handshake or not (see https://github.com/ruby/openssl/pull/60)
12
+ #
13
+ # @!attribute ca_file
14
+ # @return [String] CA file
15
+ #
16
+ # @!attribute ca_path
17
+ # @return [String] CA path
18
+ #
19
+ # @!attribute verify_mode
20
+ # @return [Integer] Any `OpenSSL::SSL::` constant (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL.html)
21
+ #
22
+ # @!attribute cert_store
23
+ # @return [OpenSSL::X509::Store] certificate store
24
+ #
25
+ # @!attribute client_cert
26
+ # @return [String, OpenSSL::X509::Certificate] client certificate
27
+ #
28
+ # @!attribute client_key
29
+ # @return [String, OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] client key
30
+ #
31
+ # @!attribute certificate
32
+ # @return [OpenSSL::X509::Certificate] certificate (Excon only)
33
+ #
34
+ # @!attribute private_key
35
+ # @return [OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] private key (Excon only)
36
+ #
37
+ # @!attribute verify_depth
38
+ # @return [Integer] maximum depth for the certificate chain verification
39
+ #
40
+ # @!attribute version
41
+ # @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)
42
+ #
43
+ # @!attribute min_version
44
+ # @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)
45
+ #
46
+ # @!attribute max_version
47
+ # @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)
48
+ class SSLOptions < Options.new(:verify, :verify_hostname,
49
+ :ca_file, :ca_path, :verify_mode,
50
+ :cert_store, :client_cert, :client_key,
51
+ :certificate, :private_key, :verify_depth,
52
+ :version, :min_version, :max_version)
53
+
54
+ # @return [Boolean] true if should verify
55
+ def verify?
56
+ verify != false
57
+ end
58
+
59
+ # @return [Boolean] true if should not verify
60
+ def disable?
61
+ !verify?
62
+ end
63
+
64
+ # @return [Boolean] true if should verify_hostname
65
+ def verify_hostname?
66
+ verify_hostname != false
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Faraday
2
4
  # Subclasses Struct with some special helpers for converting from a Hash to
3
5
  # a Struct.
@@ -10,6 +12,7 @@ module Faraday
10
12
  # Public
11
13
  def each
12
14
  return to_enum(:each) unless block_given?
15
+
13
16
  members.each do |key|
14
17
  yield(key.to_sym, send(key))
15
18
  end
@@ -27,7 +30,7 @@ module Faraday
27
30
  new_value = value
28
31
  end
29
32
 
30
- self.send("#{key}=", new_value) unless new_value.nil?
33
+ send("#{key}=", new_value) unless new_value.nil?
31
34
  end
32
35
  self
33
36
  end
@@ -47,10 +50,14 @@ module Faraday
47
50
  # Public
48
51
  def merge!(other)
49
52
  other.each do |key, other_value|
50
- self_value = self.send(key)
53
+ self_value = send(key)
51
54
  sub_options = self.class.options_for(key)
52
- new_value = (self_value && sub_options && other_value) ? self_value.merge(other_value) : other_value
53
- self.send("#{key}=", new_value) unless new_value.nil?
55
+ new_value = if self_value && sub_options && other_value
56
+ self_value.merge(other_value)
57
+ else
58
+ other_value
59
+ end
60
+ send("#{key}=", new_value) unless new_value.nil?
54
61
  end
55
62
  self
56
63
  end
@@ -69,7 +76,7 @@ module Faraday
69
76
  def fetch(key, *args)
70
77
  unless symbolized_key_set.include?(key.to_sym)
71
78
  key_setter = "#{key}="
72
- if args.size > 0
79
+ if !args.empty?
73
80
  send(key_setter, args.first)
74
81
  elsif block_given?
75
82
  send(key_setter, yield(key))
@@ -96,11 +103,10 @@ module Faraday
96
103
  end
97
104
 
98
105
  # Public
99
- def each_key
100
- return to_enum(:each_key) unless block_given?
101
- keys.each do |key|
102
- yield(key)
103
- end
106
+ def each_key(&block)
107
+ return to_enum(:each_key) unless block
108
+
109
+ keys.each(&block)
104
110
  end
105
111
 
106
112
  # Public
@@ -111,11 +117,10 @@ module Faraday
111
117
  alias has_key? key?
112
118
 
113
119
  # Public
114
- def each_value
115
- return to_enum(:each_value) unless block_given?
116
- values.each do |value|
117
- yield(value)
118
- end
120
+ def each_value(&block)
121
+ return to_enum(:each_value) unless block
122
+
123
+ values.each(&block)
119
124
  end
120
125
 
121
126
  # Public
@@ -142,9 +147,9 @@ module Faraday
142
147
  value = send(member)
143
148
  values << "#{member}=#{value.inspect}" if value
144
149
  end
145
- values = values.empty? ? ' (empty)' : (' ' << values.join(", "))
150
+ values = values.empty? ? '(empty)' : values.join(', ')
146
151
 
147
- %(#<#{self.class}#{values}>)
152
+ %(#<#{self.class} #{values}>)
148
153
  end
149
154
 
150
155
  # Internal
@@ -163,6 +168,10 @@ module Faraday
163
168
  end
164
169
 
165
170
  def self.memoized(key, &block)
171
+ unless block
172
+ raise ArgumentError, '#memoized must be called with a block'
173
+ end
174
+
166
175
  memoized_attributes[key.to_sym] = block
167
176
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
168
177
  def #{key}() self[:#{key}]; end
@@ -175,7 +184,7 @@ module Faraday
175
184
 
176
185
  def [](key)
177
186
  key = key.to_sym
178
- if method = self.class.memoized_attributes[key]
187
+ if (method = self.class.memoized_attributes[key])
179
188
  super(key) || (self[key] = instance_eval(&method))
180
189
  else
181
190
  super
@@ -183,7 +192,7 @@ module Faraday
183
192
  end
184
193
 
185
194
  def symbolized_key_set
186
- @symbolized_key_set ||= Set.new(keys.map { |k| k.to_sym })
195
+ @symbolized_key_set ||= Set.new(keys.map(&:to_sym))
187
196
  end
188
197
 
189
198
  def self.inherited(subclass)
@@ -194,180 +203,16 @@ module Faraday
194
203
 
195
204
  def self.fetch_error_class
196
205
  @fetch_error_class ||= if Object.const_defined?(:KeyError)
197
- ::KeyError
198
- else
199
- ::IndexError
200
- end
201
- end
202
- end
203
-
204
- class RequestOptions < Options.new(:params_encoder, :proxy, :bind,
205
- :timeout, :open_timeout, :write_timeout, :boundary, :oauth, :context)
206
-
207
- def []=(key, value)
208
- if key && key.to_sym == :proxy
209
- super(key, value ? ProxyOptions.from(value) : nil)
210
- else
211
- super(key, value)
212
- end
213
- end
214
- end
215
-
216
- class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode,
217
- :cert_store, :client_cert, :client_key, :certificate, :private_key, :verify_depth,
218
- :version, :min_version, :max_version)
219
-
220
- def verify?
221
- verify != false
222
- end
223
-
224
- def disable?
225
- !verify?
226
- end
227
- end
228
-
229
- class ProxyOptions < Options.new(:uri, :user, :password)
230
- extend Forwardable
231
- def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=, :path, :path=
232
-
233
- def self.from(value)
234
- case value
235
- when String
236
- value = {:uri => Utils.URI(value)}
237
- when URI
238
- value = {:uri => value}
239
- when Hash, Options
240
- if uri = value.delete(:uri)
241
- value[:uri] = Utils.URI(uri)
242
- end
243
- end
244
- super(value)
245
- end
246
-
247
- memoized(:user) { uri && uri.user && Utils.unescape(uri.user) }
248
- memoized(:password) { uri && uri.password && Utils.unescape(uri.password) }
249
- end
250
-
251
- class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url,
252
- :parallel_manager, :params, :headers, :builder_class)
253
-
254
- options :request => RequestOptions, :ssl => SSLOptions
255
-
256
- memoized(:request) { self.class.options_for(:request).new }
257
-
258
- memoized(:ssl) { self.class.options_for(:ssl).new }
259
-
260
- memoized(:builder_class) { RackBuilder }
261
-
262
- def new_builder(block)
263
- builder_class.new(&block)
264
- end
265
- end
266
-
267
- class Env < Options.new(:method, :body, :url, :request, :request_headers,
268
- :ssl, :parallel_manager, :params, :response, :response_headers, :status,
269
- :reason_phrase)
270
-
271
- ContentLength = 'Content-Length'.freeze
272
- StatusesWithoutBody = Set.new [204, 304]
273
- SuccessfulStatuses = 200..299
274
-
275
- # A Set of HTTP verbs that typically send a body. If no body is set for
276
- # these requests, the Content-Length header is set to 0.
277
- MethodsWithBodies = Set.new [:post, :put, :patch, :options]
278
-
279
- options :request => RequestOptions,
280
- :request_headers => Utils::Headers, :response_headers => Utils::Headers
281
-
282
- extend Forwardable
283
-
284
- def_delegators :request, :params_encoder
285
-
286
- # Public
287
- def self.from(value)
288
- env = super(value)
289
- if value.respond_to?(:custom_members)
290
- env.custom_members.update(value.custom_members)
291
- end
292
- env
293
- end
294
-
295
- # Public
296
- def [](key)
297
- if in_member_set?(key)
298
- super(key)
299
- else
300
- custom_members[key]
301
- end
302
- end
303
-
304
- # Public
305
- def []=(key, value)
306
- if in_member_set?(key)
307
- super(key, value)
308
- else
309
- custom_members[key] = value
310
- end
311
- end
312
-
313
- # Public
314
- def success?
315
- SuccessfulStatuses.include?(status)
316
- end
317
-
318
- # Public
319
- def needs_body?
320
- !body && MethodsWithBodies.include?(method)
321
- end
322
-
323
- # Public
324
- def clear_body
325
- request_headers[ContentLength] = '0'
326
- self.body = ''
327
- end
328
-
329
- # Public
330
- def parse_body?
331
- !StatusesWithoutBody.include?(status)
332
- end
333
-
334
- # Public
335
- def parallel?
336
- !!parallel_manager
337
- end
338
-
339
- def inspect
340
- attrs = [nil]
341
- members.each do |mem|
342
- if value = send(mem)
343
- attrs << "@#{mem}=#{value.inspect}"
344
- end
345
- end
346
- if !custom_members.empty?
347
- attrs << "@custom=#{custom_members.inspect}"
348
- end
349
- %(#<#{self.class}#{attrs.join(" ")}>)
350
- end
351
-
352
- # Internal
353
- def custom_members
354
- @custom_members ||= {}
355
- end
356
-
357
- # Internal
358
- if members.first.is_a?(Symbol)
359
- def in_member_set?(key)
360
- self.class.member_set.include?(key.to_sym)
361
- end
362
- else
363
- def in_member_set?(key)
364
- self.class.member_set.include?(key.to_s)
365
- end
366
- end
367
-
368
- # Internal
369
- def self.member_set
370
- @member_set ||= Set.new(members)
206
+ ::KeyError
207
+ else
208
+ ::IndexError
209
+ end
371
210
  end
372
211
  end
373
212
  end
213
+
214
+ require 'faraday/options/request_options'
215
+ require 'faraday/options/ssl_options'
216
+ require 'faraday/options/proxy_options'
217
+ require 'faraday/options/connection_options'
218
+ require 'faraday/options/env'