faraday 0.15.0 → 1.10.0

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +380 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +17 -345
  5. data/Rakefile +7 -0
  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 +118 -38
  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 +39 -193
  28. data/lib/faraday/parameters.rb +4 -196
  29. data/lib/faraday/rack_builder.rb +77 -65
  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/json.rb +55 -0
  34. data/lib/faraday/request/token_authentication.rb +15 -10
  35. data/lib/faraday/request/url_encoded.rb +43 -23
  36. data/lib/faraday/request.rb +93 -32
  37. data/lib/faraday/response/json.rb +54 -0
  38. data/lib/faraday/response/logger.rb +20 -69
  39. data/lib/faraday/response/raise_error.rb +49 -14
  40. data/lib/faraday/response.rb +29 -23
  41. data/lib/faraday/utils/headers.rb +139 -0
  42. data/lib/faraday/utils/params_hash.rb +61 -0
  43. data/lib/faraday/utils.rb +38 -247
  44. data/lib/faraday/version.rb +5 -0
  45. data/lib/faraday.rb +134 -189
  46. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  47. data/spec/faraday/adapter/em_http_spec.rb +49 -0
  48. data/spec/faraday/adapter/em_synchrony_spec.rb +18 -0
  49. data/spec/faraday/adapter/excon_spec.rb +49 -0
  50. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  51. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  52. data/spec/faraday/adapter/patron_spec.rb +18 -0
  53. data/spec/faraday/adapter/rack_spec.rb +8 -0
  54. data/spec/faraday/adapter/test_spec.rb +377 -0
  55. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  56. data/spec/faraday/adapter_registry_spec.rb +28 -0
  57. data/spec/faraday/adapter_spec.rb +55 -0
  58. data/spec/faraday/composite_read_io_spec.rb +80 -0
  59. data/spec/faraday/connection_spec.rb +736 -0
  60. data/spec/faraday/error_spec.rb +60 -0
  61. data/spec/faraday/middleware_spec.rb +52 -0
  62. data/spec/faraday/options/env_spec.rb +70 -0
  63. data/spec/faraday/options/options_spec.rb +297 -0
  64. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  65. data/spec/faraday/options/request_options_spec.rb +19 -0
  66. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  67. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  68. data/spec/faraday/rack_builder_spec.rb +345 -0
  69. data/spec/faraday/request/authorization_spec.rb +96 -0
  70. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  71. data/spec/faraday/request/json_spec.rb +111 -0
  72. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  73. data/spec/faraday/request_spec.rb +120 -0
  74. data/spec/faraday/response/json_spec.rb +119 -0
  75. data/spec/faraday/response/logger_spec.rb +220 -0
  76. data/spec/faraday/response/middleware_spec.rb +68 -0
  77. data/spec/faraday/response/raise_error_spec.rb +169 -0
  78. data/spec/faraday/response_spec.rb +75 -0
  79. data/spec/faraday/utils/headers_spec.rb +82 -0
  80. data/spec/faraday/utils_spec.rb +56 -0
  81. data/spec/faraday_spec.rb +37 -0
  82. data/spec/spec_helper.rb +132 -0
  83. data/spec/support/disabling_stub.rb +14 -0
  84. data/spec/support/fake_safe_buffer.rb +15 -0
  85. data/spec/support/helper_methods.rb +133 -0
  86. data/spec/support/shared_examples/adapter.rb +105 -0
  87. data/spec/support/shared_examples/params_encoder.rb +18 -0
  88. data/spec/support/shared_examples/request_method.rb +262 -0
  89. data/spec/support/streaming_response_checker.rb +35 -0
  90. data/spec/support/webmock_rack_app.rb +68 -0
  91. metadata +222 -29
  92. data/lib/faraday/adapter/em_http.rb +0 -243
  93. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  94. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  95. data/lib/faraday/adapter/em_synchrony.rb +0 -106
  96. data/lib/faraday/adapter/excon.rb +0 -79
  97. data/lib/faraday/adapter/httpclient.rb +0 -128
  98. data/lib/faraday/adapter/net_http.rb +0 -137
  99. data/lib/faraday/adapter/net_http_persistent.rb +0 -63
  100. data/lib/faraday/adapter/patron.rb +0 -100
  101. data/lib/faraday/adapter/rack.rb +0 -58
  102. data/lib/faraday/request/multipart.rb +0 -68
  103. data/lib/faraday/request/retry.rb +0 -211
  104. data/lib/faraday/upload_io.rb +0 -67
data/lib/faraday.rb CHANGED
@@ -1,248 +1,193 @@
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.15.0"
60
+ CONTENT_TYPE = 'Content-Type'
18
61
 
19
62
  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.
63
+ # The root path that Faraday is being loaded from.
64
+ #
65
+ # This is the root from where the libraries are auto-loaded.
66
+ #
67
+ # @return [String]
22
68
  attr_accessor :root_path
23
69
 
24
- # Public: Gets or sets the path that the Faraday libs are loaded from.
70
+ # Gets or sets the path that the Faraday libs are loaded from.
71
+ # @return [String]
25
72
  attr_accessor :lib_path
26
73
 
27
- # Public: Gets or sets the Symbol key identifying a default Adapter to use
28
- # for the default Faraday::Connection.
74
+ # @overload default_adapter
75
+ # Gets the Symbol key identifying a default Adapter to use
76
+ # for the default {Faraday::Connection}. Defaults to `:net_http`.
77
+ # @return [Symbol] the default adapter
78
+ # @overload default_adapter=(adapter)
79
+ # Updates default adapter while resetting {.default_connection}.
80
+ # @return [Symbol] the new default_adapter.
29
81
  attr_reader :default_adapter
30
82
 
31
- # Public: Sets the default Faraday::Connection for simple scripts that
32
- # access the Faraday constant directly.
33
- #
34
- # Faraday.get "https://faraday.com"
83
+ # Documented below, see default_connection
35
84
  attr_writer :default_connection
36
85
 
37
- # Public: Tells faraday to ignore the environment proxy (http_proxy).
86
+ # Tells Faraday to ignore the environment proxy (http_proxy).
87
+ # Defaults to `false`.
88
+ # @return [Boolean]
38
89
  attr_accessor :ignore_env_proxy
39
90
 
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
- #
91
+ # Initializes a new {Connection}.
92
+ #
93
+ # @param url [String,Hash] The optional String base URL to use as a prefix
94
+ # for all requests. Can also be the options Hash. Any of these
95
+ # values will be set on every request made, unless overridden
96
+ # for a specific request.
97
+ # @param options [Hash]
98
+ # @option options [String] :url Base URL
99
+ # @option options [Hash] :params Hash of unencoded URI query params.
100
+ # @option options [Hash] :headers Hash of unencoded HTTP headers.
101
+ # @option options [Hash] :request Hash of request options.
102
+ # @option options [Hash] :ssl Hash of SSL options.
103
+ # @option options [Hash] :proxy Hash of Proxy options.
104
+ # @return [Faraday::Connection]
105
+ #
106
+ # @example With an URL argument
56
107
  # 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)
68
- block = block_given? ? Proc.new : nil
69
- options = options ? default_connection_options.merge(options) : default_connection_options
108
+ # # => Faraday::Connection to http://faraday.com
109
+ #
110
+ # @example With an URL argument and an options hash
111
+ # Faraday.new 'http://faraday.com', params: { page: 1 }
112
+ # # => Faraday::Connection to http://faraday.com?page=1
113
+ #
114
+ # @example With everything in an options hash
115
+ # Faraday.new url: 'http://faraday.com',
116
+ # params: { page: 1 }
117
+ # # => Faraday::Connection to http://faraday.com?page=1
118
+ def new(url = nil, options = {}, &block)
119
+ options = default_connection_options.merge(options)
70
120
  Faraday::Connection.new(url, options, &block)
71
121
  end
72
122
 
123
+ # @private
73
124
  # Internal: Requires internal Faraday libraries.
74
125
  #
75
- # *libs - One or more relative String names to Faraday classes.
76
- #
77
- # Returns nothing.
126
+ # @param libs [Array] one or more relative String names to Faraday classes.
127
+ # @return [void]
78
128
  def require_libs(*libs)
79
129
  libs.each do |lib|
80
130
  require "#{lib_path}/#{lib}"
81
131
  end
82
132
  end
83
133
 
84
- # Public: Updates default adapter while resetting
85
- # #default_connection.
86
- #
87
- # Returns the new default_adapter.
134
+ alias require_lib require_libs
135
+
136
+ # Documented elsewhere, see default_adapter reader
88
137
  def default_adapter=(adapter)
89
138
  @default_connection = nil
90
139
  @default_adapter = adapter
91
140
  end
92
141
 
93
- alias require_lib require_libs
94
-
95
- def respond_to?(symbol, include_private = false)
142
+ def respond_to_missing?(symbol, include_private = false)
96
143
  default_connection.respond_to?(symbol, include_private) || super
97
144
  end
98
145
 
99
- private
100
- # Internal: Proxies method calls on the Faraday constant to
101
- # #default_connection.
102
- def method_missing(name, *args, &block)
103
- default_connection.send(name, *args, &block)
146
+ # @overload default_connection
147
+ # Gets the default connection used for simple scripts.
148
+ # @return [Faraday::Connection] a connection configured with
149
+ # the default_adapter.
150
+ # @overload default_connection=(connection)
151
+ # @param connection [Faraday::Connection]
152
+ # Sets the default {Faraday::Connection} for simple scripts that
153
+ # access the Faraday constant directly, such as
154
+ # <code>Faraday.get "https://faraday.com"</code>.
155
+ def default_connection
156
+ @default_connection ||= Connection.new(default_connection_options)
104
157
  end
105
- end
106
-
107
- self.ignore_env_proxy = false
108
- self.root_path = File.expand_path "..", __FILE__
109
- self.lib_path = File.expand_path "../faraday", __FILE__
110
- self.default_adapter = :net_http
111
-
112
- # Gets the default connection used for simple scripts.
113
- #
114
- # Returns a Faraday::Connection, configured with the #default_adapter.
115
- def self.default_connection
116
- @default_connection ||= Connection.new(default_connection_options)
117
- end
118
-
119
- # Gets the default connection options used when calling Faraday#new.
120
- #
121
- # Returns a Faraday::ConnectionOptions.
122
- def self.default_connection_options
123
- @default_connection_options ||= ConnectionOptions.new
124
- end
125
-
126
- # Public: Sets the default options used when calling Faraday#new.
127
- def self.default_connection_options=(options)
128
- @default_connection = nil
129
- @default_connection_options = ConnectionOptions.from(options)
130
- end
131
-
132
- unless const_defined? :Timer
133
- require 'timeout'
134
- Timer = Timeout
135
- end
136
158
 
137
- # Public: Adds the ability for other modules to register and lookup
138
- # middleware classes.
139
- module MiddlewareRegistry
140
- # Public: Register middleware class(es) on the current module.
141
- #
142
- # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
143
- # as fully qualified constant, or a Proc that will be lazily
144
- # called to return the former.
145
- #
146
- # Examples
147
- #
148
- # module Faraday
149
- # class Whatever
150
- # # Middleware looked up by :foo returns Faraday::Whatever::Foo.
151
- # register_middleware :foo => Foo
159
+ # Gets the default connection options used when calling {Faraday#new}.
152
160
  #
153
- # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar)
154
- # register_middleware :bar => :Bar
155
- #
156
- # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz)
157
- # register_middleware :baz => [:Baz, 'baz']
158
- # end
159
- # end
160
- #
161
- # Returns nothing.
162
- def register_middleware(autoload_path = nil, mapping = nil)
163
- if mapping.nil?
164
- mapping = autoload_path
165
- autoload_path = nil
166
- end
167
- middleware_mutex do
168
- @middleware_autoload_path = autoload_path if autoload_path
169
- (@registered_middleware ||= {}).update(mapping)
170
- end
161
+ # @return [Faraday::ConnectionOptions]
162
+ def default_connection_options
163
+ @default_connection_options ||= ConnectionOptions.new
171
164
  end
172
165
 
173
- # Public: Lookup middleware class with a registered Symbol shortcut.
174
- #
175
- # key - The Symbol key for the registered middleware.
176
- #
177
- # Examples
178
- #
179
- # module Faraday
180
- # class Whatever
181
- # register_middleware :foo => Foo
182
- # end
183
- # end
166
+ # Sets the default options used when calling {Faraday#new}.
184
167
  #
185
- # Faraday::Whatever.lookup_middleware(:foo)
186
- # # => Faraday::Whatever::Foo
187
- #
188
- # Returns a middleware Class.
189
- def lookup_middleware(key)
190
- load_middleware(key) ||
191
- raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}"))
192
- end
193
-
194
- def middleware_mutex(&block)
195
- @middleware_mutex ||= begin
196
- require 'monitor'
197
- Monitor.new
198
- end
199
- @middleware_mutex.synchronize(&block)
168
+ # @param options [Hash, Faraday::ConnectionOptions]
169
+ def default_connection_options=(options)
170
+ @default_connection = nil
171
+ @default_connection_options = ConnectionOptions.from(options)
200
172
  end
201
173
 
202
- def fetch_middleware(key)
203
- defined?(@registered_middleware) && @registered_middleware[key]
204
- end
174
+ private
205
175
 
206
- def load_middleware(key)
207
- value = fetch_middleware(key)
208
- case value
209
- when Module
210
- value
211
- when Symbol, String
212
- middleware_mutex do
213
- @registered_middleware[key] = const_get(value)
214
- end
215
- when Proc
216
- middleware_mutex do
217
- @registered_middleware[key] = value.call
218
- end
219
- when Array
220
- middleware_mutex do
221
- const, path = value
222
- if root = @middleware_autoload_path
223
- path = "#{root}/#{path}"
224
- end
225
- require(path)
226
- @registered_middleware[key] = const
227
- end
228
- load_middleware(key)
176
+ # Internal: Proxies method calls on the Faraday constant to
177
+ # .default_connection.
178
+ def method_missing(name, *args, &block)
179
+ if default_connection.respond_to?(name)
180
+ default_connection.send(name, *args, &block)
181
+ else
182
+ super
229
183
  end
230
184
  end
231
185
  end
232
186
 
233
- def self.const_missing(name)
234
- if name.to_sym == :Builder
235
- warn "Faraday::Builder is now Faraday::RackBuilder."
236
- const_set name, RackBuilder
237
- else
238
- super
239
- end
240
- end
241
-
242
- require_libs "utils", "options", "connection", "rack_builder", "parameters",
243
- "middleware", "adapter", "request", "response", "upload_io", "error"
187
+ self.ignore_env_proxy = false
188
+ self.root_path = File.expand_path __dir__
189
+ self.lib_path = File.expand_path 'faraday', __dir__
190
+ self.default_adapter = :net_http
244
191
 
245
- if !ENV["FARADAY_NO_AUTOLOAD"]
246
- require_lib 'autoload'
247
- end
192
+ require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
248
193
  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