faraday 0.17.3 → 1.9.3

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 (131) 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 +28 -40
  18. data/lib/faraday/logging/formatter.rb +105 -0
  19. data/lib/faraday/methods.rb +6 -0
  20. data/lib/faraday/middleware.rb +19 -25
  21. data/lib/faraday/middleware_registry.rb +129 -0
  22. data/lib/faraday/options/connection_options.rb +22 -0
  23. data/lib/faraday/options/env.rb +181 -0
  24. data/lib/faraday/options/proxy_options.rb +32 -0
  25. data/lib/faraday/options/request_options.rb +22 -0
  26. data/lib/faraday/options/ssl_options.rb +59 -0
  27. data/lib/faraday/options.rb +36 -191
  28. data/lib/faraday/parameters.rb +4 -197
  29. data/lib/faraday/rack_builder.rb +76 -64
  30. data/lib/faraday/request/authorization.rb +51 -30
  31. data/lib/faraday/request/basic_authentication.rb +14 -7
  32. data/lib/faraday/request/instrumentation.rb +45 -27
  33. data/lib/faraday/request/token_authentication.rb +15 -10
  34. data/lib/faraday/request/url_encoded.rb +43 -23
  35. data/lib/faraday/request.rb +84 -44
  36. data/lib/faraday/response/logger.rb +22 -69
  37. data/lib/faraday/response/raise_error.rb +49 -18
  38. data/lib/faraday/response.rb +24 -20
  39. data/lib/faraday/utils/headers.rb +139 -0
  40. data/lib/faraday/utils/params_hash.rb +61 -0
  41. data/lib/faraday/utils.rb +38 -247
  42. data/lib/faraday/version.rb +5 -0
  43. data/lib/faraday.rb +133 -189
  44. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  45. data/spec/faraday/adapter/em_http_spec.rb +49 -0
  46. data/spec/faraday/adapter/em_synchrony_spec.rb +18 -0
  47. data/spec/faraday/adapter/excon_spec.rb +49 -0
  48. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  49. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  50. data/spec/faraday/adapter/patron_spec.rb +18 -0
  51. data/spec/faraday/adapter/rack_spec.rb +8 -0
  52. data/spec/faraday/adapter/test_spec.rb +377 -0
  53. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  54. data/spec/faraday/adapter_registry_spec.rb +28 -0
  55. data/spec/faraday/adapter_spec.rb +55 -0
  56. data/spec/faraday/composite_read_io_spec.rb +80 -0
  57. data/spec/faraday/connection_spec.rb +736 -0
  58. data/spec/faraday/error_spec.rb +12 -54
  59. data/spec/faraday/middleware_spec.rb +52 -0
  60. data/spec/faraday/options/env_spec.rb +70 -0
  61. data/spec/faraday/options/options_spec.rb +297 -0
  62. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  63. data/spec/faraday/options/request_options_spec.rb +19 -0
  64. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  65. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  66. data/spec/faraday/rack_builder_spec.rb +345 -0
  67. data/spec/faraday/request/authorization_spec.rb +96 -0
  68. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  69. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  70. data/spec/faraday/request_spec.rb +120 -0
  71. data/spec/faraday/response/logger_spec.rb +220 -0
  72. data/spec/faraday/response/middleware_spec.rb +68 -0
  73. data/spec/faraday/response/raise_error_spec.rb +78 -15
  74. data/spec/faraday/response_spec.rb +75 -0
  75. data/spec/faraday/utils/headers_spec.rb +82 -0
  76. data/spec/faraday/utils_spec.rb +56 -0
  77. data/spec/faraday_spec.rb +37 -0
  78. data/spec/spec_helper.rb +63 -36
  79. data/spec/support/disabling_stub.rb +14 -0
  80. data/spec/support/fake_safe_buffer.rb +15 -0
  81. data/spec/support/helper_methods.rb +133 -0
  82. data/spec/support/shared_examples/adapter.rb +105 -0
  83. data/spec/support/shared_examples/params_encoder.rb +18 -0
  84. data/spec/support/shared_examples/request_method.rb +262 -0
  85. data/spec/support/streaming_response_checker.rb +35 -0
  86. data/spec/support/webmock_rack_app.rb +68 -0
  87. metadata +206 -58
  88. data/lib/faraday/adapter/em_http.rb +0 -243
  89. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  90. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  91. data/lib/faraday/adapter/em_synchrony.rb +0 -106
  92. data/lib/faraday/adapter/excon.rb +0 -82
  93. data/lib/faraday/adapter/httpclient.rb +0 -128
  94. data/lib/faraday/adapter/net_http.rb +0 -152
  95. data/lib/faraday/adapter/net_http_persistent.rb +0 -68
  96. data/lib/faraday/adapter/patron.rb +0 -95
  97. data/lib/faraday/adapter/rack.rb +0 -58
  98. data/lib/faraday/deprecate.rb +0 -107
  99. data/lib/faraday/request/multipart.rb +0 -68
  100. data/lib/faraday/request/retry.rb +0 -213
  101. data/lib/faraday/upload_io.rb +0 -67
  102. data/spec/faraday/deprecate_spec.rb +0 -69
  103. data/test/adapters/default_test.rb +0 -14
  104. data/test/adapters/em_http_test.rb +0 -30
  105. data/test/adapters/em_synchrony_test.rb +0 -32
  106. data/test/adapters/excon_test.rb +0 -30
  107. data/test/adapters/httpclient_test.rb +0 -34
  108. data/test/adapters/integration.rb +0 -263
  109. data/test/adapters/logger_test.rb +0 -136
  110. data/test/adapters/net_http_persistent_test.rb +0 -114
  111. data/test/adapters/net_http_test.rb +0 -79
  112. data/test/adapters/patron_test.rb +0 -40
  113. data/test/adapters/rack_test.rb +0 -38
  114. data/test/adapters/test_middleware_test.rb +0 -157
  115. data/test/adapters/typhoeus_test.rb +0 -38
  116. data/test/authentication_middleware_test.rb +0 -65
  117. data/test/composite_read_io_test.rb +0 -109
  118. data/test/connection_test.rb +0 -738
  119. data/test/env_test.rb +0 -268
  120. data/test/helper.rb +0 -75
  121. data/test/live_server.rb +0 -67
  122. data/test/middleware/instrumentation_test.rb +0 -88
  123. data/test/middleware/retry_test.rb +0 -282
  124. data/test/middleware_stack_test.rb +0 -260
  125. data/test/multibyte.txt +0 -1
  126. data/test/options_test.rb +0 -333
  127. data/test/parameters_test.rb +0 -157
  128. data/test/request_middleware_test.rb +0 -126
  129. data/test/response_middleware_test.rb +0 -72
  130. data/test/strawberry.rb +0 -2
  131. data/test/utils_test.rb +0 -98
data/lib/faraday.rb CHANGED
@@ -1,247 +1,191 @@
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/request/url_encoded' # needed by multipart
28
+
29
+ # External Middleware gems and their aliases
30
+ require 'faraday/multipart'
31
+ require 'faraday/retry'
32
+ Faraday::Request::Multipart = Faraday::Multipart::Middleware
33
+ Faraday::Request::Retry = Faraday::Retry::Middleware
34
+
35
+ # External Adapters gems
36
+ unless defined?(JRUBY_VERSION)
37
+ require 'faraday/em_http'
38
+ require 'faraday/em_synchrony'
39
+ end
40
+ require 'faraday/excon'
41
+ require 'faraday/httpclient'
42
+ require 'faraday/net_http'
43
+ require 'faraday/net_http_persistent'
44
+ require 'faraday/patron'
45
+ require 'faraday/rack'
46
+
47
+ # This is the main namespace for Faraday.
8
48
  #
9
- # Examples
49
+ # It provides methods to create {Connection} objects, and HTTP-related
50
+ # methods to use directly.
10
51
  #
52
+ # @example Helpful class methods for easy usage
11
53
  # Faraday.get "http://faraday.com"
12
54
  #
55
+ # @example Helpful class method `.new` to create {Connection} objects.
13
56
  # conn = Faraday.new "http://faraday.com"
14
57
  # conn.get '/'
15
58
  #
16
59
  module Faraday
17
- VERSION = "0.17.3"
18
-
19
60
  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.
61
+ # The root path that Faraday is being loaded from.
62
+ #
63
+ # This is the root from where the libraries are auto-loaded.
64
+ #
65
+ # @return [String]
22
66
  attr_accessor :root_path
23
67
 
24
- # Public: Gets or sets the path that the Faraday libs are loaded from.
68
+ # Gets or sets the path that the Faraday libs are loaded from.
69
+ # @return [String]
25
70
  attr_accessor :lib_path
26
71
 
27
- # Public: Gets or sets the Symbol key identifying a default Adapter to use
28
- # for the default Faraday::Connection.
72
+ # @overload default_adapter
73
+ # Gets the Symbol key identifying a default Adapter to use
74
+ # for the default {Faraday::Connection}. Defaults to `:net_http`.
75
+ # @return [Symbol] the default adapter
76
+ # @overload default_adapter=(adapter)
77
+ # Updates default adapter while resetting {.default_connection}.
78
+ # @return [Symbol] the new default_adapter.
29
79
  attr_reader :default_adapter
30
80
 
31
- # Public: Sets the default Faraday::Connection for simple scripts that
32
- # access the Faraday constant directly.
33
- #
34
- # Faraday.get "https://faraday.com"
81
+ # Documented below, see default_connection
35
82
  attr_writer :default_connection
36
83
 
37
- # Public: Tells faraday to ignore the environment proxy (http_proxy).
84
+ # Tells Faraday to ignore the environment proxy (http_proxy).
85
+ # Defaults to `false`.
86
+ # @return [Boolean]
38
87
  attr_accessor :ignore_env_proxy
39
88
 
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
- #
89
+ # Initializes a new {Connection}.
90
+ #
91
+ # @param url [String,Hash] The optional String base URL to use as a prefix
92
+ # for all requests. Can also be the options Hash. Any of these
93
+ # values will be set on every request made, unless overridden
94
+ # for a specific request.
95
+ # @param options [Hash]
96
+ # @option options [String] :url Base URL
97
+ # @option options [Hash] :params Hash of unencoded URI query params.
98
+ # @option options [Hash] :headers Hash of unencoded HTTP headers.
99
+ # @option options [Hash] :request Hash of request options.
100
+ # @option options [Hash] :ssl Hash of SSL options.
101
+ # @option options [Hash] :proxy Hash of Proxy options.
102
+ # @return [Faraday::Connection]
103
+ #
104
+ # @example With an URL argument
56
105
  # 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
106
+ # # => Faraday::Connection to http://faraday.com
107
+ #
108
+ # @example With an URL argument and an options hash
109
+ # Faraday.new 'http://faraday.com', params: { page: 1 }
110
+ # # => Faraday::Connection to http://faraday.com?page=1
111
+ #
112
+ # @example With everything in an options hash
113
+ # Faraday.new url: 'http://faraday.com',
114
+ # params: { page: 1 }
115
+ # # => Faraday::Connection to http://faraday.com?page=1
116
+ def new(url = nil, options = {}, &block)
117
+ options = default_connection_options.merge(options)
69
118
  Faraday::Connection.new(url, options, &block)
70
119
  end
71
120
 
121
+ # @private
72
122
  # Internal: Requires internal Faraday libraries.
73
123
  #
74
- # *libs - One or more relative String names to Faraday classes.
75
- #
76
- # Returns nothing.
124
+ # @param libs [Array] one or more relative String names to Faraday classes.
125
+ # @return [void]
77
126
  def require_libs(*libs)
78
127
  libs.each do |lib|
79
128
  require "#{lib_path}/#{lib}"
80
129
  end
81
130
  end
82
131
 
83
- # Public: Updates default adapter while resetting
84
- # #default_connection.
85
- #
86
- # Returns the new default_adapter.
132
+ alias require_lib require_libs
133
+
134
+ # Documented elsewhere, see default_adapter reader
87
135
  def default_adapter=(adapter)
88
136
  @default_connection = nil
89
137
  @default_adapter = adapter
90
138
  end
91
139
 
92
- alias require_lib require_libs
93
-
94
- def respond_to?(symbol, include_private = false)
140
+ def respond_to_missing?(symbol, include_private = false)
95
141
  default_connection.respond_to?(symbol, include_private) || super
96
142
  end
97
143
 
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)
144
+ # @overload default_connection
145
+ # Gets the default connection used for simple scripts.
146
+ # @return [Faraday::Connection] a connection configured with
147
+ # the default_adapter.
148
+ # @overload default_connection=(connection)
149
+ # @param connection [Faraday::Connection]
150
+ # Sets the default {Faraday::Connection} for simple scripts that
151
+ # access the Faraday constant directly, such as
152
+ # <code>Faraday.get "https://faraday.com"</code>.
153
+ def default_connection
154
+ @default_connection ||= Connection.new(default_connection_options)
103
155
  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
156
 
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
157
+ # Gets the default connection options used when calling {Faraday#new}.
151
158
  #
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
159
+ # @return [Faraday::ConnectionOptions]
160
+ def default_connection_options
161
+ @default_connection_options ||= ConnectionOptions.new
170
162
  end
171
163
 
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
164
+ # Sets the default options used when calling {Faraday#new}.
183
165
  #
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)
166
+ # @param options [Hash, Faraday::ConnectionOptions]
167
+ def default_connection_options=(options)
168
+ @default_connection = nil
169
+ @default_connection_options = ConnectionOptions.from(options)
199
170
  end
200
171
 
201
- def fetch_middleware(key)
202
- defined?(@registered_middleware) && @registered_middleware[key]
203
- end
172
+ private
204
173
 
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)
174
+ # Internal: Proxies method calls on the Faraday constant to
175
+ # .default_connection.
176
+ def method_missing(name, *args, &block)
177
+ if default_connection.respond_to?(name)
178
+ default_connection.send(name, *args, &block)
179
+ else
180
+ super
228
181
  end
229
182
  end
230
183
  end
231
184
 
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"
185
+ self.ignore_env_proxy = false
186
+ self.root_path = File.expand_path __dir__
187
+ self.lib_path = File.expand_path 'faraday', __dir__
188
+ self.default_adapter = :net_http
243
189
 
244
- if !ENV["FARADAY_NO_AUTOLOAD"]
245
- require_lib 'autoload'
246
- end
190
+ require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
247
191
  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