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
data/lib/faraday.rb CHANGED
@@ -1,247 +1,185 @@
1
- require 'thread'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'cgi'
4
+ require 'date'
3
5
  require 'set'
4
6
  require 'forwardable'
7
+ require 'faraday/middleware_registry'
8
+ require 'faraday/dependency_loader'
9
+
10
+ unless defined?(::Faraday::Timer)
11
+ require 'timeout'
12
+ ::Faraday::Timer = Timeout
13
+ end
5
14
 
6
- # Public: This is the main namespace for Faraday. You can either use it to
7
- # create Faraday::Connection objects, or access it directly.
15
+ require 'faraday/version'
16
+ require 'faraday/methods'
17
+ require 'faraday/utils'
18
+ require 'faraday/options'
19
+ require 'faraday/connection'
20
+ require 'faraday/rack_builder'
21
+ require 'faraday/parameters'
22
+ require 'faraday/middleware'
23
+ require 'faraday/adapter'
24
+ require 'faraday/request'
25
+ require 'faraday/response'
26
+ require 'faraday/error'
27
+ require 'faraday/file_part'
28
+ require 'faraday/param_part'
29
+
30
+ unless defined?(JRUBY_VERSION)
31
+ require 'faraday/em_http'
32
+ require 'faraday/em_synchrony'
33
+ end
34
+ require 'faraday/excon'
35
+ require 'faraday/httpclient'
36
+ require 'faraday/net_http'
37
+ require 'faraday/net_http_persistent'
38
+ require 'faraday/patron'
39
+ require 'faraday/rack'
40
+
41
+ # This is the main namespace for Faraday.
8
42
  #
9
- # Examples
43
+ # It provides methods to create {Connection} objects, and HTTP-related
44
+ # methods to use directly.
10
45
  #
46
+ # @example Helpful class methods for easy usage
11
47
  # Faraday.get "http://faraday.com"
12
48
  #
49
+ # @example Helpful class method `.new` to create {Connection} objects.
13
50
  # conn = Faraday.new "http://faraday.com"
14
51
  # conn.get '/'
15
52
  #
16
53
  module Faraday
17
- VERSION = "0.17.4"
18
-
19
54
  class << self
20
- # Public: Gets or sets the root path that Faraday is being loaded from.
21
- # This is the root from where the libraries are auto-loaded from.
55
+ # The root path that Faraday is being loaded from.
56
+ #
57
+ # This is the root from where the libraries are auto-loaded.
58
+ #
59
+ # @return [String]
22
60
  attr_accessor :root_path
23
61
 
24
- # Public: Gets or sets the path that the Faraday libs are loaded from.
62
+ # Gets or sets the path that the Faraday libs are loaded from.
63
+ # @return [String]
25
64
  attr_accessor :lib_path
26
65
 
27
- # Public: Gets or sets the Symbol key identifying a default Adapter to use
28
- # for the default Faraday::Connection.
66
+ # @overload default_adapter
67
+ # Gets the Symbol key identifying a default Adapter to use
68
+ # for the default {Faraday::Connection}. Defaults to `:net_http`.
69
+ # @return [Symbol] the default adapter
70
+ # @overload default_adapter=(adapter)
71
+ # Updates default adapter while resetting {.default_connection}.
72
+ # @return [Symbol] the new default_adapter.
29
73
  attr_reader :default_adapter
30
74
 
31
- # Public: Sets the default Faraday::Connection for simple scripts that
32
- # access the Faraday constant directly.
33
- #
34
- # Faraday.get "https://faraday.com"
75
+ # Documented below, see default_connection
35
76
  attr_writer :default_connection
36
77
 
37
- # Public: Tells faraday to ignore the environment proxy (http_proxy).
78
+ # Tells Faraday to ignore the environment proxy (http_proxy).
79
+ # Defaults to `false`.
80
+ # @return [Boolean]
38
81
  attr_accessor :ignore_env_proxy
39
82
 
40
- # Public: Initializes a new Faraday::Connection.
41
- #
42
- # url - The optional String base URL to use as a prefix for all
43
- # requests. Can also be the options Hash.
44
- # options - The optional Hash used to configure this Faraday::Connection.
45
- # Any of these values will be set on every request made, unless
46
- # overridden for a specific request.
47
- # :url - String base URL.
48
- # :params - Hash of URI query unencoded key/value pairs.
49
- # :headers - Hash of unencoded HTTP header key/value pairs.
50
- # :request - Hash of request options.
51
- # :ssl - Hash of SSL options.
52
- # :proxy - Hash of Proxy options.
53
- #
54
- # Examples
55
- #
83
+ # Initializes a new {Connection}.
84
+ #
85
+ # @param url [String,Hash] The optional String base URL to use as a prefix
86
+ # for all requests. Can also be the options Hash. Any of these
87
+ # values will be set on every request made, unless overridden
88
+ # for a specific request.
89
+ # @param options [Hash]
90
+ # @option options [String] :url Base URL
91
+ # @option options [Hash] :params Hash of unencoded URI query params.
92
+ # @option options [Hash] :headers Hash of unencoded HTTP headers.
93
+ # @option options [Hash] :request Hash of request options.
94
+ # @option options [Hash] :ssl Hash of SSL options.
95
+ # @option options [Hash] :proxy Hash of Proxy options.
96
+ # @return [Faraday::Connection]
97
+ #
98
+ # @example With an URL argument
56
99
  # Faraday.new 'http://faraday.com'
57
- #
58
- # # http://faraday.com?page=1
59
- # Faraday.new 'http://faraday.com', :params => {:page => 1}
60
- #
61
- # # same
62
- #
63
- # Faraday.new :url => 'http://faraday.com',
64
- # :params => {:page => 1}
65
- #
66
- # Returns a Faraday::Connection.
67
- def new(url = nil, options = nil, &block)
68
- options = options ? default_connection_options.merge(options) : default_connection_options
100
+ # # => Faraday::Connection to http://faraday.com
101
+ #
102
+ # @example With an URL argument and an options hash
103
+ # Faraday.new 'http://faraday.com', params: { page: 1 }
104
+ # # => Faraday::Connection to http://faraday.com?page=1
105
+ #
106
+ # @example With everything in an options hash
107
+ # Faraday.new url: 'http://faraday.com',
108
+ # params: { page: 1 }
109
+ # # => Faraday::Connection to http://faraday.com?page=1
110
+ def new(url = nil, options = {}, &block)
111
+ options = default_connection_options.merge(options)
69
112
  Faraday::Connection.new(url, options, &block)
70
113
  end
71
114
 
115
+ # @private
72
116
  # Internal: Requires internal Faraday libraries.
73
117
  #
74
- # *libs - One or more relative String names to Faraday classes.
75
- #
76
- # Returns nothing.
118
+ # @param libs [Array] one or more relative String names to Faraday classes.
119
+ # @return [void]
77
120
  def require_libs(*libs)
78
121
  libs.each do |lib|
79
122
  require "#{lib_path}/#{lib}"
80
123
  end
81
124
  end
82
125
 
83
- # Public: Updates default adapter while resetting
84
- # #default_connection.
85
- #
86
- # Returns the new default_adapter.
126
+ alias require_lib require_libs
127
+
128
+ # Documented elsewhere, see default_adapter reader
87
129
  def default_adapter=(adapter)
88
130
  @default_connection = nil
89
131
  @default_adapter = adapter
90
132
  end
91
133
 
92
- alias require_lib require_libs
93
-
94
- def respond_to?(symbol, include_private = false)
134
+ def respond_to_missing?(symbol, include_private = false)
95
135
  default_connection.respond_to?(symbol, include_private) || super
96
136
  end
97
137
 
98
- private
99
- # Internal: Proxies method calls on the Faraday constant to
100
- # #default_connection.
101
- def method_missing(name, *args, &block)
102
- default_connection.send(name, *args, &block)
138
+ # @overload default_connection
139
+ # Gets the default connection used for simple scripts.
140
+ # @return [Faraday::Connection] a connection configured with
141
+ # the default_adapter.
142
+ # @overload default_connection=(connection)
143
+ # @param connection [Faraday::Connection]
144
+ # Sets the default {Faraday::Connection} for simple scripts that
145
+ # access the Faraday constant directly, such as
146
+ # <code>Faraday.get "https://faraday.com"</code>.
147
+ def default_connection
148
+ @default_connection ||= Connection.new(default_connection_options)
103
149
  end
104
- end
105
-
106
- self.ignore_env_proxy = false
107
- self.root_path = File.expand_path "..", __FILE__
108
- self.lib_path = File.expand_path "../faraday", __FILE__
109
- self.default_adapter = :net_http
110
150
 
111
- # Gets the default connection used for simple scripts.
112
- #
113
- # Returns a Faraday::Connection, configured with the #default_adapter.
114
- def self.default_connection
115
- @default_connection ||= Connection.new(default_connection_options)
116
- end
117
-
118
- # Gets the default connection options used when calling Faraday#new.
119
- #
120
- # Returns a Faraday::ConnectionOptions.
121
- def self.default_connection_options
122
- @default_connection_options ||= ConnectionOptions.new
123
- end
124
-
125
- # Public: Sets the default options used when calling Faraday#new.
126
- def self.default_connection_options=(options)
127
- @default_connection = nil
128
- @default_connection_options = ConnectionOptions.from(options)
129
- end
130
-
131
- unless const_defined? :Timer
132
- require 'timeout'
133
- Timer = Timeout
134
- end
135
-
136
- # Public: Adds the ability for other modules to register and lookup
137
- # middleware classes.
138
- module MiddlewareRegistry
139
- # Public: Register middleware class(es) on the current module.
140
- #
141
- # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
142
- # as fully qualified constant, or a Proc that will be lazily
143
- # called to return the former.
144
- #
145
- # Examples
146
- #
147
- # module Faraday
148
- # class Whatever
149
- # # Middleware looked up by :foo returns Faraday::Whatever::Foo.
150
- # register_middleware :foo => Foo
151
+ # Gets the default connection options used when calling {Faraday#new}.
151
152
  #
152
- # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar)
153
- # register_middleware :bar => :Bar
154
- #
155
- # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz)
156
- # register_middleware :baz => [:Baz, 'baz']
157
- # end
158
- # end
159
- #
160
- # Returns nothing.
161
- def register_middleware(autoload_path = nil, mapping = nil)
162
- if mapping.nil?
163
- mapping = autoload_path
164
- autoload_path = nil
165
- end
166
- middleware_mutex do
167
- @middleware_autoload_path = autoload_path if autoload_path
168
- (@registered_middleware ||= {}).update(mapping)
169
- end
153
+ # @return [Faraday::ConnectionOptions]
154
+ def default_connection_options
155
+ @default_connection_options ||= ConnectionOptions.new
170
156
  end
171
157
 
172
- # Public: Lookup middleware class with a registered Symbol shortcut.
173
- #
174
- # key - The Symbol key for the registered middleware.
175
- #
176
- # Examples
177
- #
178
- # module Faraday
179
- # class Whatever
180
- # register_middleware :foo => Foo
181
- # end
182
- # end
158
+ # Sets the default options used when calling {Faraday#new}.
183
159
  #
184
- # Faraday::Whatever.lookup_middleware(:foo)
185
- # # => Faraday::Whatever::Foo
186
- #
187
- # Returns a middleware Class.
188
- def lookup_middleware(key)
189
- load_middleware(key) ||
190
- raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}"))
191
- end
192
-
193
- def middleware_mutex(&block)
194
- @middleware_mutex ||= begin
195
- require 'monitor'
196
- Monitor.new
197
- end
198
- @middleware_mutex.synchronize(&block)
160
+ # @param options [Hash, Faraday::ConnectionOptions]
161
+ def default_connection_options=(options)
162
+ @default_connection = nil
163
+ @default_connection_options = ConnectionOptions.from(options)
199
164
  end
200
165
 
201
- def fetch_middleware(key)
202
- defined?(@registered_middleware) && @registered_middleware[key]
203
- end
166
+ private
204
167
 
205
- def load_middleware(key)
206
- value = fetch_middleware(key)
207
- case value
208
- when Module
209
- value
210
- when Symbol, String
211
- middleware_mutex do
212
- @registered_middleware[key] = const_get(value)
213
- end
214
- when Proc
215
- middleware_mutex do
216
- @registered_middleware[key] = value.call
217
- end
218
- when Array
219
- middleware_mutex do
220
- const, path = value
221
- if root = @middleware_autoload_path
222
- path = "#{root}/#{path}"
223
- end
224
- require(path)
225
- @registered_middleware[key] = const
226
- end
227
- load_middleware(key)
168
+ # Internal: Proxies method calls on the Faraday constant to
169
+ # .default_connection.
170
+ def method_missing(name, *args, &block)
171
+ if default_connection.respond_to?(name)
172
+ default_connection.send(name, *args, &block)
173
+ else
174
+ super
228
175
  end
229
176
  end
230
177
  end
231
178
 
232
- def self.const_missing(name)
233
- if name.to_sym == :Builder
234
- warn "Faraday::Builder is now Faraday::RackBuilder."
235
- const_set name, RackBuilder
236
- else
237
- super
238
- end
239
- end
240
-
241
- require_libs "utils", "options", "connection", "rack_builder", "parameters",
242
- "middleware", "adapter", "request", "response", "upload_io", "error"
179
+ self.ignore_env_proxy = false
180
+ self.root_path = File.expand_path __dir__
181
+ self.lib_path = File.expand_path 'faraday', __dir__
182
+ self.default_adapter = :net_http
243
183
 
244
- if !ENV["FARADAY_NO_AUTOLOAD"]
245
- require_lib 'autoload'
246
- end
184
+ require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
247
185
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'webmock/rspec'
4
+ WebMock.disable_net_connect!(allow_localhost: true)
5
+
6
+ require_relative '../support/helper_methods'
7
+ require_relative '../support/disabling_stub'
8
+ require_relative '../support/streaming_response_checker'
9
+ require_relative '../support/shared_examples/adapter'
10
+ require_relative '../support/shared_examples/request_method'
11
+
12
+ RSpec.configure do |config|
13
+ config.include Faraday::HelperMethods
14
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ unless defined?(JRUBY_VERSION)
4
+ RSpec.describe Faraday::Adapter::EMHttp do
5
+ features :request_body_on_query_methods, :reason_phrase_parse, :trace_method,
6
+ :skip_response_body_on_head, :parallel, :local_socket_binding
7
+
8
+ it_behaves_like 'an adapter'
9
+
10
+ it 'allows to provide adapter specific configs' do
11
+ url = URI('https://example.com:1234')
12
+ adapter = described_class.new nil, inactivity_timeout: 20
13
+ req = adapter.create_request(url: url, request: {})
14
+
15
+ expect(req.connopts.inactivity_timeout).to eq(20)
16
+ end
17
+
18
+ context 'Options' do
19
+ let(:request) { Faraday::RequestOptions.new }
20
+ let(:env) { { request: request } }
21
+ let(:options) { {} }
22
+ let(:adapter) { Faraday::Adapter::EMHttp.new }
23
+
24
+ it 'configures timeout' do
25
+ request.timeout = 5
26
+ adapter.configure_timeout(options, env)
27
+ expect(options[:inactivity_timeout]).to eq(5)
28
+ expect(options[:connect_timeout]).to eq(5)
29
+ end
30
+
31
+ it 'configures timeout and open_timeout' do
32
+ request.timeout = 5
33
+ request.open_timeout = 1
34
+ adapter.configure_timeout(options, env)
35
+ expect(options[:inactivity_timeout]).to eq(5)
36
+ expect(options[:connect_timeout]).to eq(1)
37
+ end
38
+
39
+ it 'configures all timeout settings' do
40
+ request.timeout = 5
41
+ request.read_timeout = 3
42
+ request.open_timeout = 1
43
+ adapter.configure_timeout(options, env)
44
+ expect(options[:inactivity_timeout]).to eq(3)
45
+ expect(options[:connect_timeout]).to eq(1)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ unless defined?(JRUBY_VERSION)
4
+ RSpec.describe Faraday::Adapter::EMSynchrony do
5
+ features :request_body_on_query_methods, :reason_phrase_parse,
6
+ :skip_response_body_on_head, :parallel, :local_socket_binding
7
+
8
+ it_behaves_like 'an adapter'
9
+
10
+ it 'allows to provide adapter specific configs' do
11
+ url = URI('https://example.com:1234')
12
+ adapter = described_class.new nil, inactivity_timeout: 20
13
+ req = adapter.create_request(url: url, request: {})
14
+
15
+ expect(req.connopts.inactivity_timeout).to eq(20)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Faraday::Adapter::Excon do
4
+ features :request_body_on_query_methods, :reason_phrase_parse, :trace_method
5
+
6
+ it_behaves_like 'an adapter'
7
+
8
+ it 'allows to provide adapter specific configs' do
9
+ url = URI('https://example.com:1234')
10
+
11
+ adapter = described_class.new(nil, debug_request: true)
12
+
13
+ conn = adapter.build_connection(url: url)
14
+
15
+ expect(conn.data[:debug_request]).to be_truthy
16
+ end
17
+
18
+ context 'config' do
19
+ let(:adapter) { Faraday::Adapter::Excon.new }
20
+ let(:request) { Faraday::RequestOptions.new }
21
+ let(:uri) { URI.parse('https://example.com') }
22
+ let(:env) { { request: request, url: uri } }
23
+
24
+ it 'sets timeout' do
25
+ request.timeout = 5
26
+ options = adapter.send(:opts_from_env, env)
27
+ expect(options[:read_timeout]).to eq(5)
28
+ expect(options[:write_timeout]).to eq(5)
29
+ expect(options[:connect_timeout]).to eq(5)
30
+ end
31
+
32
+ it 'sets timeout and open_timeout' do
33
+ request.timeout = 5
34
+ request.open_timeout = 3
35
+ options = adapter.send(:opts_from_env, env)
36
+ expect(options[:read_timeout]).to eq(5)
37
+ expect(options[:write_timeout]).to eq(5)
38
+ expect(options[:connect_timeout]).to eq(3)
39
+ end
40
+
41
+ it 'sets open_timeout' do
42
+ request.open_timeout = 3
43
+ options = adapter.send(:opts_from_env, env)
44
+ expect(options[:read_timeout]).to eq(nil)
45
+ expect(options[:write_timeout]).to eq(nil)
46
+ expect(options[:connect_timeout]).to eq(3)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Faraday::Adapter::HTTPClient do
4
+ # ruby gem defaults for testing purposes
5
+ HTTPCLIENT_OPEN = 60
6
+ HTTPCLIENT_READ = 60
7
+ HTTPCLIENT_WRITE = 120
8
+
9
+ features :request_body_on_query_methods, :reason_phrase_parse, :compression,
10
+ :trace_method, :local_socket_binding
11
+
12
+ it_behaves_like 'an adapter'
13
+
14
+ it 'allows to provide adapter specific configs' do
15
+ adapter = described_class.new do |client|
16
+ client.keep_alive_timeout = 20
17
+ client.ssl_config.timeout = 25
18
+ end
19
+
20
+ client = adapter.build_connection(url: URI.parse('https://example.com'))
21
+ expect(client.keep_alive_timeout).to eq(20)
22
+ expect(client.ssl_config.timeout).to eq(25)
23
+ end
24
+
25
+ context 'Options' do
26
+ let(:request) { Faraday::RequestOptions.new }
27
+ let(:env) { { request: request } }
28
+ let(:options) { {} }
29
+ let(:adapter) { Faraday::Adapter::HTTPClient.new }
30
+ let(:client) { adapter.connection(url: URI.parse('https://example.com')) }
31
+
32
+ it 'configures timeout' do
33
+ assert_default_timeouts!
34
+
35
+ request.timeout = 5
36
+ adapter.configure_timeouts(client, request)
37
+
38
+ expect(client.connect_timeout).to eq(5)
39
+ expect(client.send_timeout).to eq(5)
40
+ expect(client.receive_timeout).to eq(5)
41
+ end
42
+
43
+ it 'configures open timeout' do
44
+ assert_default_timeouts!
45
+
46
+ request.open_timeout = 1
47
+ adapter.configure_timeouts(client, request)
48
+
49
+ expect(client.connect_timeout).to eq(1)
50
+ expect(client.send_timeout).to eq(HTTPCLIENT_WRITE)
51
+ expect(client.receive_timeout).to eq(HTTPCLIENT_READ)
52
+ end
53
+
54
+ it 'configures multiple timeouts' do
55
+ assert_default_timeouts!
56
+
57
+ request.open_timeout = 1
58
+ request.write_timeout = 10
59
+ request.read_timeout = 5
60
+ adapter.configure_timeouts(client, request)
61
+
62
+ expect(client.connect_timeout).to eq(1)
63
+ expect(client.send_timeout).to eq(10)
64
+ expect(client.receive_timeout).to eq(5)
65
+ end
66
+
67
+ def assert_default_timeouts!
68
+ expect(client.connect_timeout).to eq(HTTPCLIENT_OPEN)
69
+ expect(client.send_timeout).to eq(HTTPCLIENT_WRITE)
70
+ expect(client.receive_timeout).to eq(HTTPCLIENT_READ)
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Faraday::Adapter::NetHttp do
4
+ features :request_body_on_query_methods, :reason_phrase_parse, :compression, :streaming, :trace_method
5
+
6
+ it_behaves_like 'an adapter'
7
+
8
+ context 'checking http' do
9
+ let(:url) { URI('http://example.com') }
10
+ let(:adapter) { described_class.new }
11
+ let(:http) { adapter.send(:connection, url: url, request: {}) }
12
+
13
+ it { expect(http.port).to eq(80) }
14
+
15
+ it 'sets max_retries to 0' do
16
+ adapter.send(:configure_request, http, {})
17
+
18
+ expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=)
19
+ end
20
+
21
+ it 'supports write_timeout' do
22
+ adapter.send(:configure_request, http, write_timeout: 10)
23
+
24
+ expect(http.write_timeout).to eq(10) if http.respond_to?(:write_timeout=)
25
+ end
26
+
27
+ it 'supports open_timeout' do
28
+ adapter.send(:configure_request, http, open_timeout: 10)
29
+
30
+ expect(http.open_timeout).to eq(10)
31
+ end
32
+
33
+ it 'supports read_timeout' do
34
+ adapter.send(:configure_request, http, read_timeout: 10)
35
+
36
+ expect(http.read_timeout).to eq(10)
37
+ end
38
+
39
+ context 'with https url' do
40
+ let(:url) { URI('https://example.com') }
41
+
42
+ it { expect(http.port).to eq(443) }
43
+ end
44
+
45
+ context 'with http url including port' do
46
+ let(:url) { URI('https://example.com:1234') }
47
+
48
+ it { expect(http.port).to eq(1234) }
49
+ end
50
+
51
+ context 'with custom adapter config' do
52
+ let(:adapter) do
53
+ described_class.new do |http|
54
+ http.continue_timeout = 123
55
+ end
56
+ end
57
+
58
+ it do
59
+ adapter.send(:configure_request, http, {})
60
+ expect(http.continue_timeout).to eq(123)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Faraday::Adapter::Patron, unless: defined?(JRUBY_VERSION) do
4
+ features :reason_phrase_parse
5
+
6
+ it_behaves_like 'an adapter'
7
+
8
+ it 'allows to provide adapter specific configs' do
9
+ conn = Faraday.new do |f|
10
+ f.adapter :patron do |session|
11
+ session.max_redirects = 10
12
+ raise 'Configuration block called'
13
+ end
14
+ end
15
+
16
+ expect { conn.get('/') }.to raise_error(RuntimeError, 'Configuration block called')
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Faraday::Adapter::Rack do
4
+ features :request_body_on_query_methods, :trace_method,
5
+ :skip_response_body_on_head
6
+
7
+ it_behaves_like 'an adapter', adapter_options: WebmockRackApp.new
8
+ end