faraday 1.8.0 → 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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +197 -3
  3. data/LICENSE.md +1 -1
  4. data/README.md +18 -16
  5. data/examples/client_spec.rb +41 -19
  6. data/examples/client_test.rb +48 -22
  7. data/lib/faraday/adapter/test.rb +59 -10
  8. data/lib/faraday/adapter.rb +5 -9
  9. data/lib/faraday/connection.rb +47 -129
  10. data/lib/faraday/encoders/nested_params_encoder.rb +13 -6
  11. data/lib/faraday/error.rb +3 -8
  12. data/lib/faraday/logging/formatter.rb +19 -2
  13. data/lib/faraday/middleware.rb +3 -1
  14. data/lib/faraday/middleware_registry.rb +17 -63
  15. data/lib/faraday/options/env.rb +31 -7
  16. data/lib/faraday/options/ssl_options.rb +11 -1
  17. data/lib/faraday/options.rb +3 -3
  18. data/lib/faraday/rack_builder.rb +23 -20
  19. data/lib/faraday/request/authorization.rb +33 -41
  20. data/lib/faraday/request/instrumentation.rb +2 -0
  21. data/lib/faraday/request/json.rb +55 -0
  22. data/lib/faraday/request/url_encoded.rb +5 -1
  23. data/lib/faraday/request.rb +12 -32
  24. data/lib/faraday/response/json.rb +54 -0
  25. data/lib/faraday/response/logger.rb +8 -4
  26. data/lib/faraday/response/raise_error.rb +9 -1
  27. data/lib/faraday/response.rb +10 -20
  28. data/lib/faraday/utils/headers.rb +7 -2
  29. data/lib/faraday/utils.rb +10 -5
  30. data/lib/faraday/version.rb +1 -1
  31. data/lib/faraday.rb +10 -38
  32. data/spec/faraday/adapter/test_spec.rb +65 -0
  33. data/spec/faraday/connection_spec.rb +163 -91
  34. data/spec/faraday/middleware_registry_spec.rb +31 -0
  35. data/spec/faraday/middleware_spec.rb +18 -0
  36. data/spec/faraday/options/env_spec.rb +8 -2
  37. data/spec/faraday/params_encoders/nested_spec.rb +8 -0
  38. data/spec/faraday/rack_builder_spec.rb +26 -54
  39. data/spec/faraday/request/authorization_spec.rb +50 -28
  40. data/spec/faraday/request/instrumentation_spec.rb +5 -7
  41. data/spec/faraday/request/json_spec.rb +111 -0
  42. data/spec/faraday/request/url_encoded_spec.rb +12 -2
  43. data/spec/faraday/request_spec.rb +5 -15
  44. data/spec/faraday/response/json_spec.rb +117 -0
  45. data/spec/faraday/response/logger_spec.rb +28 -0
  46. data/spec/faraday/response/raise_error_spec.rb +7 -4
  47. data/spec/faraday/response_spec.rb +3 -1
  48. data/spec/faraday/utils/headers_spec.rb +22 -4
  49. data/spec/faraday/utils_spec.rb +63 -1
  50. data/spec/support/fake_safe_buffer.rb +1 -1
  51. data/spec/support/helper_methods.rb +0 -37
  52. data/spec/support/shared_examples/adapter.rb +2 -2
  53. data/spec/support/shared_examples/request_method.rb +22 -21
  54. metadata +14 -143
  55. data/lib/faraday/adapter/typhoeus.rb +0 -15
  56. data/lib/faraday/autoload.rb +0 -87
  57. data/lib/faraday/dependency_loader.rb +0 -37
  58. data/lib/faraday/file_part.rb +0 -128
  59. data/lib/faraday/param_part.rb +0 -53
  60. data/lib/faraday/request/basic_authentication.rb +0 -20
  61. data/lib/faraday/request/multipart.rb +0 -106
  62. data/lib/faraday/request/retry.rb +0 -239
  63. data/lib/faraday/request/token_authentication.rb +0 -20
  64. data/spec/faraday/adapter/em_http_spec.rb +0 -49
  65. data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
  66. data/spec/faraday/adapter/excon_spec.rb +0 -49
  67. data/spec/faraday/adapter/httpclient_spec.rb +0 -73
  68. data/spec/faraday/adapter/net_http_spec.rb +0 -64
  69. data/spec/faraday/adapter/patron_spec.rb +0 -18
  70. data/spec/faraday/adapter/rack_spec.rb +0 -8
  71. data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
  72. data/spec/faraday/composite_read_io_spec.rb +0 -80
  73. data/spec/faraday/request/multipart_spec.rb +0 -302
  74. data/spec/faraday/request/retry_spec.rb +0 -242
  75. data/spec/faraday/response/middleware_spec.rb +0 -68
  76. data/spec/support/webmock_rack_app.rb +0 -68
@@ -44,13 +44,21 @@ module Faraday
44
44
  body: env.body,
45
45
  request: {
46
46
  method: env.method,
47
+ url: env.url,
47
48
  url_path: env.url.path,
48
- params: env.params,
49
+ params: query_params(env),
49
50
  headers: env.request_headers,
50
51
  body: env.request_body
51
52
  }
52
53
  }
53
54
  end
55
+
56
+ def query_params(env)
57
+ env.request.params_encoder ||= Faraday::Utils.default_params_encoder
58
+ env.params_encoder.decode(env.url.query)
59
+ end
54
60
  end
55
61
  end
56
62
  end
63
+
64
+ Faraday::Response.register_middleware(raise_error: Faraday::Response::RaiseError)
@@ -5,25 +5,9 @@ require 'forwardable'
5
5
  module Faraday
6
6
  # Response represents an HTTP response from making an HTTP request.
7
7
  class Response
8
- # Used for simple response middleware.
9
- class Middleware < Faraday::Middleware
10
- # Override this to modify the environment after the response has finished.
11
- # Calls the `parse` method if defined
12
- # `parse` method can be defined as private, public and protected
13
- def on_complete(env)
14
- return unless respond_to?(:parse, true) && env.parse_body?
15
-
16
- env.body = parse(env.body)
17
- end
18
- end
19
-
20
8
  extend Forwardable
21
9
  extend MiddlewareRegistry
22
10
 
23
- register_middleware File.expand_path('response', __dir__),
24
- raise_error: [:RaiseError, 'raise_error'],
25
- logger: [:Logger, 'logger']
26
-
27
11
  def initialize(env = nil)
28
12
  @env = Env.from(env) if env
29
13
  @on_complete_callbacks = []
@@ -42,6 +26,7 @@ module Faraday
42
26
  def headers
43
27
  finished? ? env.response_headers : {}
44
28
  end
29
+
45
30
  def_delegator :headers, :[]
46
31
 
47
32
  def body
@@ -53,10 +38,10 @@ module Faraday
53
38
  end
54
39
 
55
40
  def on_complete(&block)
56
- if !finished?
57
- @on_complete_callbacks << block
58
- else
41
+ if finished?
59
42
  yield(env)
43
+ else
44
+ @on_complete_callbacks << block
60
45
  end
61
46
  self
62
47
  end
@@ -76,7 +61,8 @@ module Faraday
76
61
  def to_hash
77
62
  {
78
63
  status: env.status, body: env.body,
79
- response_headers: env.response_headers
64
+ response_headers: env.response_headers,
65
+ url: env.url
80
66
  }
81
67
  end
82
68
 
@@ -99,3 +85,7 @@ module Faraday
99
85
  end
100
86
  end
101
87
  end
88
+
89
+ require 'faraday/response/json'
90
+ require 'faraday/response/logger'
91
+ require 'faraday/response/raise_error'
@@ -111,7 +111,7 @@ module Faraday
111
111
  def parse(header_string)
112
112
  return unless header_string && !header_string.empty?
113
113
 
114
- headers = header_string.split(/\r\n/)
114
+ headers = header_string.split("\r\n")
115
115
 
116
116
  # Find the last set of response headers.
117
117
  start_index = headers.rindex { |x| x.start_with?('HTTP/') } || 0
@@ -132,7 +132,12 @@ module Faraday
132
132
 
133
133
  # Join multiple values with a comma.
134
134
  def add_parsed(key, value)
135
- self[key] ? self[key] << ', ' << value : self[key] = value
135
+ if key?(key)
136
+ self[key] = self[key].to_s
137
+ self[key] << ', ' << value
138
+ else
139
+ self[key] = value
140
+ end
136
141
  end
137
142
  end
138
143
  end
data/lib/faraday/utils.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'base64'
4
+ require 'uri'
3
5
  require 'faraday/utils/headers'
4
6
  require 'faraday/utils/params_hash'
5
7
 
@@ -51,6 +53,12 @@ module Faraday
51
53
  @default_params_encoder ||= NestedParamsEncoder
52
54
  end
53
55
 
56
+ def basic_header_from(login, pass)
57
+ value = Base64.encode64("#{login}:#{pass}")
58
+ value.delete!("\n")
59
+ "Basic #{value}"
60
+ end
61
+
54
62
  class << self
55
63
  attr_writer :default_params_encoder
56
64
  end
@@ -71,10 +79,7 @@ module Faraday
71
79
  end
72
80
 
73
81
  def default_uri_parser
74
- @default_uri_parser ||= begin
75
- require 'uri'
76
- Kernel.method(:URI)
77
- end
82
+ @default_uri_parser ||= Kernel.method(:URI)
78
83
  end
79
84
 
80
85
  def default_uri_parser=(parser)
@@ -96,7 +101,7 @@ module Faraday
96
101
  # Recursive hash update
97
102
  def deep_merge!(target, hash)
98
103
  hash.each do |key, value|
99
- target[key] = if value.is_a?(Hash) && target[key].is_a?(Hash)
104
+ target[key] = if value.is_a?(Hash) && (target[key].is_a?(Hash) || target[key].is_a?(Options))
100
105
  deep_merge(target[key], value)
101
106
  else
102
107
  value
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Faraday
4
- VERSION = '1.8.0'
4
+ VERSION = '2.7.4'
5
5
  end
data/lib/faraday.rb CHANGED
@@ -4,16 +4,10 @@ require 'cgi'
4
4
  require 'date'
5
5
  require 'set'
6
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
14
-
15
7
  require 'faraday/version'
16
8
  require 'faraday/methods'
9
+ require 'faraday/error'
10
+ require 'faraday/middleware_registry'
17
11
  require 'faraday/utils'
18
12
  require 'faraday/options'
19
13
  require 'faraday/connection'
@@ -23,21 +17,7 @@ require 'faraday/middleware'
23
17
  require 'faraday/adapter'
24
18
  require 'faraday/request'
25
19
  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
20
  require 'faraday/net_http'
37
- require 'faraday/net_http_persistent'
38
- require 'faraday/patron'
39
- require 'faraday/rack'
40
-
41
21
  # This is the main namespace for Faraday.
42
22
  #
43
23
  # It provides methods to create {Connection} objects, and HTTP-related
@@ -51,6 +31,8 @@ require 'faraday/rack'
51
31
  # conn.get '/'
52
32
  #
53
33
  module Faraday
34
+ CONTENT_TYPE = 'Content-Type'
35
+
54
36
  class << self
55
37
  # The root path that Faraday is being loaded from.
56
38
  #
@@ -72,6 +54,10 @@ module Faraday
72
54
  # @return [Symbol] the new default_adapter.
73
55
  attr_reader :default_adapter
74
56
 
57
+ # Option for the default_adapter
58
+ # @return [Hash] default_adapter options
59
+ attr_accessor :default_adapter_options
60
+
75
61
  # Documented below, see default_connection
76
62
  attr_writer :default_connection
77
63
 
@@ -108,23 +94,10 @@ module Faraday
108
94
  # params: { page: 1 }
109
95
  # # => Faraday::Connection to http://faraday.com?page=1
110
96
  def new(url = nil, options = {}, &block)
111
- options = default_connection_options.merge(options)
97
+ options = Utils.deep_merge(default_connection_options, options)
112
98
  Faraday::Connection.new(url, options, &block)
113
99
  end
114
100
 
115
- # @private
116
- # Internal: Requires internal Faraday libraries.
117
- #
118
- # @param libs [Array] one or more relative String names to Faraday classes.
119
- # @return [void]
120
- def require_libs(*libs)
121
- libs.each do |lib|
122
- require "#{lib_path}/#{lib}"
123
- end
124
- end
125
-
126
- alias require_lib require_libs
127
-
128
101
  # Documented elsewhere, see default_adapter reader
129
102
  def default_adapter=(adapter)
130
103
  @default_connection = nil
@@ -180,6 +153,5 @@ module Faraday
180
153
  self.root_path = File.expand_path __dir__
181
154
  self.lib_path = File.expand_path 'faraday', __dir__
182
155
  self.default_adapter = :net_http
183
-
184
- require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
156
+ self.default_adapter_options = {}
185
157
  end
@@ -373,5 +373,70 @@ RSpec.describe Faraday::Adapter::Test do
373
373
  it_behaves_like 'does not raise NotFound even when headers do not satisfy the strict check', '/with_user_agent', { authorization: 'Bearer m_ck', user_agent: 'My Agent' }
374
374
  it_behaves_like 'does not raise NotFound even when headers do not satisfy the strict check', '/with_user_agent', { authorization: 'Bearer m_ck', user_agent: 'My Agent', x_special: 'special' }
375
375
  end
376
+
377
+ describe 'body_match?' do
378
+ let(:stubs) do
379
+ described_class::Stubs.new do |stubs|
380
+ stubs.post('/no_check') { [200, {}, 'ok'] }
381
+ stubs.post('/with_string', 'abc') { [200, {}, 'ok'] }
382
+ stubs.post(
383
+ '/with_proc',
384
+ ->(request_body) { JSON.parse(request_body, symbolize_names: true) == { x: '!', a: [{ m: [{ a: true }], n: 123 }] } },
385
+ { content_type: 'application/json' }
386
+ ) do
387
+ [200, {}, 'ok']
388
+ end
389
+ end
390
+ end
391
+
392
+ context 'when trying without any args for body' do
393
+ subject(:without_body) { connection.post('/no_check') }
394
+
395
+ it { expect(without_body.status).to eq 200 }
396
+ end
397
+
398
+ context 'when trying with string body stubs' do
399
+ subject(:with_string) { connection.post('/with_string', 'abc') }
400
+
401
+ it { expect(with_string.status).to eq 200 }
402
+ end
403
+
404
+ context 'when trying with proc body stubs' do
405
+ subject(:with_proc) do
406
+ connection.post('/with_proc', JSON.dump(a: [{ n: 123, m: [{ a: true }] }], x: '!'), { 'Content-Type' => 'application/json' })
407
+ end
408
+
409
+ it { expect(with_proc.status).to eq 200 }
410
+ end
411
+ end
412
+ end
413
+
414
+ describe 'request timeout' do
415
+ subject(:request) do
416
+ connection.get('/sleep') do |req|
417
+ req.options.timeout = timeout
418
+ end
419
+ end
420
+
421
+ before do
422
+ stubs.get('/sleep') do
423
+ sleep(0.01)
424
+ [200, {}, '']
425
+ end
426
+ end
427
+
428
+ context 'when request is within timeout' do
429
+ let(:timeout) { 1 }
430
+
431
+ it { expect(request.status).to eq 200 }
432
+ end
433
+
434
+ context 'when request is too slow' do
435
+ let(:timeout) { 0.001 }
436
+
437
+ it 'raises an exception' do
438
+ expect { request }.to raise_error(Faraday::TimeoutError)
439
+ end
440
+ end
376
441
  end
377
442
  end