faraday 2.7.0 → 2.13.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -1
- data/LICENSE.md +1 -1
- data/README.md +29 -17
- data/Rakefile +6 -1
- data/lib/faraday/adapter/test.rb +20 -7
- data/lib/faraday/adapter.rb +2 -3
- data/lib/faraday/connection.rb +35 -32
- data/lib/faraday/encoders/nested_params_encoder.rb +1 -1
- data/lib/faraday/error.rb +59 -7
- data/lib/faraday/logging/formatter.rb +18 -20
- data/lib/faraday/middleware.rb +40 -1
- data/lib/faraday/options/connection_options.rb +7 -6
- data/lib/faraday/options/env.rb +68 -63
- data/lib/faraday/options/proxy_options.rb +11 -5
- data/lib/faraday/options/request_options.rb +7 -6
- data/lib/faraday/options/ssl_options.rb +57 -50
- data/lib/faraday/options.rb +4 -3
- data/lib/faraday/rack_builder.rb +21 -25
- data/lib/faraday/request/instrumentation.rb +3 -1
- data/lib/faraday/request/json.rb +18 -3
- data/lib/faraday/request.rb +10 -7
- data/lib/faraday/response/json.rb +21 -1
- data/lib/faraday/response/logger.rb +7 -5
- data/lib/faraday/response/raise_error.rb +36 -17
- data/lib/faraday/response.rb +2 -1
- data/lib/faraday/utils/headers.rb +8 -2
- data/lib/faraday/utils.rb +3 -4
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +2 -1
- data/spec/faraday/adapter/test_spec.rb +29 -0
- data/spec/faraday/connection_spec.rb +17 -2
- data/spec/faraday/error_spec.rb +122 -7
- data/spec/faraday/middleware_spec.rb +143 -0
- data/spec/faraday/options/options_spec.rb +1 -1
- data/spec/faraday/options/proxy_options_spec.rb +35 -0
- data/spec/faraday/params_encoders/nested_spec.rb +2 -1
- data/spec/faraday/request/json_spec.rb +88 -0
- data/spec/faraday/response/json_spec.rb +89 -0
- data/spec/faraday/response/logger_spec.rb +50 -5
- data/spec/faraday/response/raise_error_spec.rb +112 -9
- data/spec/faraday/response_spec.rb +3 -1
- data/spec/faraday/utils/headers_spec.rb +9 -0
- data/spec/faraday/utils_spec.rb +3 -1
- data/spec/faraday_spec.rb +10 -4
- data/spec/spec_helper.rb +6 -5
- data/spec/support/faraday_middleware_subclasses.rb +18 -0
- metadata +26 -14
data/lib/faraday/options/env.rb
CHANGED
@@ -1,65 +1,70 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Faraday
|
4
|
-
# @!
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# - `:
|
20
|
-
#
|
21
|
-
# - `:
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
4
|
+
# @!parse
|
5
|
+
# # @!attribute method
|
6
|
+
# # @return [Symbol] HTTP method (`:get`, `:post`)
|
7
|
+
# #
|
8
|
+
# # @!attribute body
|
9
|
+
# # @return [String] The request body that will eventually be converted to a
|
10
|
+
# # string.
|
11
|
+
# #
|
12
|
+
# # @!attribute url
|
13
|
+
# # @return [URI] URI instance for the current request.
|
14
|
+
# #
|
15
|
+
# # @!attribute request
|
16
|
+
# # @return [Hash] options for configuring the request.
|
17
|
+
# # Options for configuring the request.
|
18
|
+
# #
|
19
|
+
# # - `:timeout` - time limit for the entire request (Integer in
|
20
|
+
# # seconds)
|
21
|
+
# # - `:open_timeout` - time limit for just the connection phase (e.g.
|
22
|
+
# # handshake) (Integer in seconds)
|
23
|
+
# # - `:read_timeout` - time limit for the first response byte received from
|
24
|
+
# # the server (Integer in seconds)
|
25
|
+
# # - `:write_timeout` - time limit for the client to send the request to the
|
26
|
+
# # server (Integer in seconds)
|
27
|
+
# # - `:on_data` - Proc for streaming
|
28
|
+
# # - `:proxy` - Hash of proxy options
|
29
|
+
# # - `:uri` - Proxy server URI
|
30
|
+
# # - `:user` - Proxy server username
|
31
|
+
# # - `:password` - Proxy server password
|
32
|
+
# #
|
33
|
+
# # @!attribute request_headers
|
34
|
+
# # @return [Hash] HTTP Headers to be sent to the server.
|
35
|
+
# #
|
36
|
+
# # @!attribute ssl
|
37
|
+
# # @return [Hash] options for configuring SSL requests
|
38
|
+
# #
|
39
|
+
# # @!attribute parallel_manager
|
40
|
+
# # @return [Object] sent if the connection is in parallel mode
|
41
|
+
# #
|
42
|
+
# # @!attribute params
|
43
|
+
# # @return [Hash]
|
44
|
+
# #
|
45
|
+
# # @!attribute response
|
46
|
+
# # @return [Response]
|
47
|
+
# #
|
48
|
+
# # @!attribute response_headers
|
49
|
+
# # @return [Hash] HTTP headers from the server
|
50
|
+
# #
|
51
|
+
# # @!attribute status
|
52
|
+
# # @return [Integer] HTTP response status code
|
53
|
+
# #
|
54
|
+
# # @!attribute reason_phrase
|
55
|
+
# # @return [String]
|
56
|
+
# class Env < Options; end
|
57
|
+
Env = Options.new(:method, :request_body, :url, :request,
|
58
|
+
:request_headers, :ssl, :parallel_manager, :params,
|
59
|
+
:response, :response_headers, :status,
|
60
|
+
:reason_phrase, :response_body) do
|
61
|
+
const_set(:ContentLength, 'Content-Length')
|
62
|
+
const_set(:StatusesWithoutBody, Set.new([204, 304]))
|
63
|
+
const_set(:SuccessfulStatuses, 200..299)
|
59
64
|
|
60
65
|
# A Set of HTTP verbs that typically send a body. If no body is set for
|
61
66
|
# these requests, the Content-Length header is set to 0.
|
62
|
-
MethodsWithBodies
|
67
|
+
const_set(:MethodsWithBodies, Set.new(Faraday::METHODS_WITH_BODY.map(&:to_sym)))
|
63
68
|
|
64
69
|
options request: RequestOptions,
|
65
70
|
request_headers: Utils::Headers, response_headers: Utils::Headers
|
@@ -120,25 +125,25 @@ module Faraday
|
|
120
125
|
|
121
126
|
# @return [Boolean] true if status is in the set of {SuccessfulStatuses}.
|
122
127
|
def success?
|
123
|
-
SuccessfulStatuses.include?(status)
|
128
|
+
Env::SuccessfulStatuses.include?(status)
|
124
129
|
end
|
125
130
|
|
126
131
|
# @return [Boolean] true if there's no body yet, and the method is in the
|
127
|
-
# set of {MethodsWithBodies}.
|
132
|
+
# set of {Env::MethodsWithBodies}.
|
128
133
|
def needs_body?
|
129
|
-
!body && MethodsWithBodies.include?(method)
|
134
|
+
!body && Env::MethodsWithBodies.include?(method)
|
130
135
|
end
|
131
136
|
|
132
137
|
# Sets content length to zero and the body to the empty string.
|
133
138
|
def clear_body
|
134
|
-
request_headers[ContentLength] = '0'
|
139
|
+
request_headers[Env::ContentLength] = '0'
|
135
140
|
self.body = +''
|
136
141
|
end
|
137
142
|
|
138
143
|
# @return [Boolean] true if the status isn't in the set of
|
139
|
-
# {StatusesWithoutBody}.
|
144
|
+
# {Env::StatusesWithoutBody}.
|
140
145
|
def parse_body?
|
141
|
-
!StatusesWithoutBody.include?(status)
|
146
|
+
!Env::StatusesWithoutBody.include?(status)
|
142
147
|
end
|
143
148
|
|
144
149
|
# @return [Boolean] true if there is a parallel_manager
|
@@ -164,7 +169,7 @@ module Faraday
|
|
164
169
|
def stream_response(&block)
|
165
170
|
size = 0
|
166
171
|
yielded = false
|
167
|
-
block_result = block.call do |chunk|
|
172
|
+
block_result = block.call do |chunk|
|
168
173
|
if chunk.bytesize.positive? || size.positive?
|
169
174
|
yielded = true
|
170
175
|
size += chunk.bytesize
|
@@ -1,15 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Faraday
|
4
|
-
#
|
5
|
-
#
|
6
|
-
|
4
|
+
# @!parse
|
5
|
+
# # ProxyOptions contains the configurable properties for the proxy
|
6
|
+
# # configuration used when making an HTTP request.
|
7
|
+
# class ProxyOptions < Options; end
|
8
|
+
ProxyOptions = Options.new(:uri, :user, :password) do
|
7
9
|
extend Forwardable
|
8
10
|
def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=,
|
9
11
|
:path, :path=
|
10
12
|
|
11
13
|
def self.from(value)
|
12
14
|
case value
|
15
|
+
when ''
|
16
|
+
value = nil
|
13
17
|
when String
|
14
18
|
# URIs without a scheme should default to http (like 'example:123').
|
15
19
|
# This fixes #1282 and prevents a silent failure in some adapters.
|
@@ -18,8 +22,10 @@ module Faraday
|
|
18
22
|
when URI
|
19
23
|
value = { uri: value }
|
20
24
|
when Hash, Options
|
21
|
-
if
|
22
|
-
value
|
25
|
+
if value[:uri]
|
26
|
+
value = value.dup.tap do |duped|
|
27
|
+
duped[:uri] = Utils.URI(duped[:uri])
|
28
|
+
end
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Faraday
|
4
|
-
#
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
# @!parse
|
5
|
+
# # RequestOptions contains the configurable properties for a Faraday request.
|
6
|
+
# class RequestOptions < Options; end
|
7
|
+
RequestOptions = Options.new(:params_encoder, :proxy, :bind,
|
8
|
+
:timeout, :open_timeout, :read_timeout,
|
9
|
+
:write_timeout, :boundary, :oauth,
|
10
|
+
:context, :on_data) do
|
10
11
|
def []=(key, value)
|
11
12
|
if key && key.to_sym == :proxy
|
12
13
|
super(key, value ? ProxyOptions.from(value) : nil)
|
@@ -1,56 +1,63 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Faraday
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
4
|
+
# @!parse
|
5
|
+
# # SSL-related options.
|
6
|
+
# #
|
7
|
+
# # @!attribute verify
|
8
|
+
# # @return [Boolean] whether to verify SSL certificates or not
|
9
|
+
# #
|
10
|
+
# # @!attribute verify_hostname
|
11
|
+
# # @return [Boolean] whether to enable hostname verification on server certificates
|
12
|
+
# # during the handshake or not (see https://github.com/ruby/openssl/pull/60)
|
13
|
+
# #
|
14
|
+
# # @!attribute hostname
|
15
|
+
# # @return [String] Server hostname used for SNI (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLSocket.html#method-i-hostname-3D)
|
16
|
+
# #
|
17
|
+
# # @!attribute ca_file
|
18
|
+
# # @return [String] CA file
|
19
|
+
# #
|
20
|
+
# # @!attribute ca_path
|
21
|
+
# # @return [String] CA path
|
22
|
+
# #
|
23
|
+
# # @!attribute verify_mode
|
24
|
+
# # @return [Integer] Any `OpenSSL::SSL::` constant (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL.html)
|
25
|
+
# #
|
26
|
+
# # @!attribute cert_store
|
27
|
+
# # @return [OpenSSL::X509::Store] certificate store
|
28
|
+
# #
|
29
|
+
# # @!attribute client_cert
|
30
|
+
# # @return [String, OpenSSL::X509::Certificate] client certificate
|
31
|
+
# #
|
32
|
+
# # @!attribute client_key
|
33
|
+
# # @return [String, OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] client key
|
34
|
+
# #
|
35
|
+
# # @!attribute certificate
|
36
|
+
# # @return [OpenSSL::X509::Certificate] certificate (Excon only)
|
37
|
+
# #
|
38
|
+
# # @!attribute private_key
|
39
|
+
# # @return [OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] private key (Excon only)
|
40
|
+
# #
|
41
|
+
# # @!attribute verify_depth
|
42
|
+
# # @return [Integer] maximum depth for the certificate chain verification
|
43
|
+
# #
|
44
|
+
# # @!attribute version
|
45
|
+
# # @return [String, Symbol] SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-ssl_version-3D)
|
46
|
+
# #
|
47
|
+
# # @!attribute min_version
|
48
|
+
# # @return [String, Symbol] minimum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-min_version-3D)
|
49
|
+
# #
|
50
|
+
# # @!attribute max_version
|
51
|
+
# # @return [String, Symbol] maximum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-max_version-3D)
|
52
|
+
# #
|
53
|
+
# # @!attribute ciphers
|
54
|
+
# # @return [String] cipher list in OpenSSL format (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-ciphers-3D)
|
55
|
+
# class SSLOptions < Options; end
|
56
|
+
SSLOptions = Options.new(:verify, :verify_hostname, :hostname,
|
57
|
+
:ca_file, :ca_path, :verify_mode,
|
58
|
+
:cert_store, :client_cert, :client_key,
|
59
|
+
:certificate, :private_key, :verify_depth,
|
60
|
+
:version, :min_version, :max_version, :ciphers) do
|
54
61
|
# @return [Boolean] true if should verify
|
55
62
|
def verify?
|
56
63
|
verify != false
|
data/lib/faraday/options.rb
CHANGED
@@ -30,7 +30,7 @@ module Faraday
|
|
30
30
|
new_value = value
|
31
31
|
end
|
32
32
|
|
33
|
-
send("#{key}=", new_value) unless new_value.nil?
|
33
|
+
send(:"#{key}=", new_value) unless new_value.nil?
|
34
34
|
end
|
35
35
|
self
|
36
36
|
end
|
@@ -38,7 +38,7 @@ module Faraday
|
|
38
38
|
# Public
|
39
39
|
def delete(key)
|
40
40
|
value = send(key)
|
41
|
-
send("#{key}=", nil)
|
41
|
+
send(:"#{key}=", nil)
|
42
42
|
value
|
43
43
|
end
|
44
44
|
|
@@ -57,7 +57,7 @@ module Faraday
|
|
57
57
|
else
|
58
58
|
other_value
|
59
59
|
end
|
60
|
-
send("#{key}=", new_value) unless new_value.nil?
|
60
|
+
send(:"#{key}=", new_value) unless new_value.nil?
|
61
61
|
end
|
62
62
|
self
|
63
63
|
end
|
@@ -174,6 +174,7 @@ module Faraday
|
|
174
174
|
|
175
175
|
memoized_attributes[key.to_sym] = block
|
176
176
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
177
|
+
remove_method(key) if method_defined?(key, false)
|
177
178
|
def #{key}() self[:#{key}]; end
|
178
179
|
RUBY
|
179
180
|
end
|
data/lib/faraday/rack_builder.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'ruby2_keywords'
|
4
3
|
require 'faraday/adapter_registry'
|
5
4
|
|
6
5
|
module Faraday
|
@@ -28,10 +27,11 @@ module Faraday
|
|
28
27
|
|
29
28
|
attr_reader :name
|
30
29
|
|
31
|
-
|
30
|
+
def initialize(klass, *args, **kwargs, &block)
|
32
31
|
@name = klass.to_s
|
33
32
|
REGISTRY.set(klass) if klass.respond_to?(:name)
|
34
33
|
@args = args
|
34
|
+
@kwargs = kwargs
|
35
35
|
@block = block
|
36
36
|
end
|
37
37
|
|
@@ -54,7 +54,7 @@ module Faraday
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def build(app = nil)
|
57
|
-
klass.new(app, *@args, &@block)
|
57
|
+
klass.new(app, *@args, **@kwargs, &@block)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -89,52 +89,52 @@ module Faraday
|
|
89
89
|
@handlers.frozen?
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
def use(klass, ...)
|
93
93
|
if klass.is_a? Symbol
|
94
|
-
use_symbol(Faraday::Middleware, klass,
|
94
|
+
use_symbol(Faraday::Middleware, klass, ...)
|
95
95
|
else
|
96
96
|
raise_if_locked
|
97
97
|
raise_if_adapter(klass)
|
98
|
-
@handlers << self.class::Handler.new(klass,
|
98
|
+
@handlers << self.class::Handler.new(klass, ...)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
|
103
|
-
use_symbol(Faraday::Request, key,
|
102
|
+
def request(key, ...)
|
103
|
+
use_symbol(Faraday::Request, key, ...)
|
104
104
|
end
|
105
105
|
|
106
|
-
|
107
|
-
use_symbol(Faraday::Response,
|
106
|
+
def response(...)
|
107
|
+
use_symbol(Faraday::Response, ...)
|
108
108
|
end
|
109
109
|
|
110
|
-
|
110
|
+
def adapter(klass = NO_ARGUMENT, *args, **kwargs, &block)
|
111
111
|
return @adapter if klass == NO_ARGUMENT || klass.nil?
|
112
112
|
|
113
113
|
klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
|
114
|
-
@adapter = self.class::Handler.new(klass, *args, &block)
|
114
|
+
@adapter = self.class::Handler.new(klass, *args, **kwargs, &block)
|
115
115
|
end
|
116
116
|
|
117
117
|
## methods to push onto the various positions in the stack:
|
118
118
|
|
119
|
-
|
119
|
+
def insert(index, ...)
|
120
120
|
raise_if_locked
|
121
121
|
index = assert_index(index)
|
122
|
-
handler = self.class::Handler.new(
|
122
|
+
handler = self.class::Handler.new(...)
|
123
123
|
@handlers.insert(index, handler)
|
124
124
|
end
|
125
125
|
|
126
126
|
alias insert_before insert
|
127
127
|
|
128
|
-
|
128
|
+
def insert_after(index, ...)
|
129
129
|
index = assert_index(index)
|
130
|
-
insert(index + 1,
|
130
|
+
insert(index + 1, ...)
|
131
131
|
end
|
132
132
|
|
133
|
-
|
133
|
+
def swap(index, ...)
|
134
134
|
raise_if_locked
|
135
135
|
index = assert_index(index)
|
136
136
|
@handlers.delete_at(index)
|
137
|
-
insert(index,
|
137
|
+
insert(index, ...)
|
138
138
|
end
|
139
139
|
|
140
140
|
def delete(handler)
|
@@ -221,7 +221,7 @@ module Faraday
|
|
221
221
|
end
|
222
222
|
|
223
223
|
def raise_if_adapter(klass)
|
224
|
-
return unless
|
224
|
+
return unless klass <= Faraday::Adapter
|
225
225
|
|
226
226
|
raise 'Adapter should be set using the `adapter` method, not `use`'
|
227
227
|
end
|
@@ -234,12 +234,8 @@ module Faraday
|
|
234
234
|
!@adapter.nil?
|
235
235
|
end
|
236
236
|
|
237
|
-
def
|
238
|
-
|
239
|
-
end
|
240
|
-
|
241
|
-
ruby2_keywords def use_symbol(mod, key, *args, &block)
|
242
|
-
use(mod.lookup_middleware(key), *args, &block)
|
237
|
+
def use_symbol(mod, key, ...)
|
238
|
+
use(mod.lookup_middleware(key), ...)
|
243
239
|
end
|
244
240
|
|
245
241
|
def assert_index(index)
|
@@ -5,12 +5,14 @@ module Faraday
|
|
5
5
|
# Middleware for instrumenting Requests.
|
6
6
|
class Instrumentation < Faraday::Middleware
|
7
7
|
# Options class used in Request::Instrumentation class.
|
8
|
-
|
8
|
+
Options = Faraday::Options.new(:name, :instrumenter) do
|
9
|
+
remove_method :name
|
9
10
|
# @return [String]
|
10
11
|
def name
|
11
12
|
self[:name] ||= 'request.faraday'
|
12
13
|
end
|
13
14
|
|
15
|
+
remove_method :instrumenter
|
14
16
|
# @return [Class]
|
15
17
|
def instrumenter
|
16
18
|
self[:instrumenter] ||= ActiveSupport::Notifications
|
data/lib/faraday/request/json.rb
CHANGED
@@ -13,7 +13,7 @@ module Faraday
|
|
13
13
|
# Doesn't try to encode bodies that already are in string form.
|
14
14
|
class Json < Middleware
|
15
15
|
MIME_TYPE = 'application/json'
|
16
|
-
MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}
|
16
|
+
MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}
|
17
17
|
|
18
18
|
def on_request(env)
|
19
19
|
match_content_type(env) do |data|
|
@@ -24,7 +24,13 @@ module Faraday
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def encode(data)
|
27
|
-
|
27
|
+
if options[:encoder].is_a?(Array) && options[:encoder].size >= 2
|
28
|
+
options[:encoder][0].public_send(options[:encoder][1], data)
|
29
|
+
elsif options[:encoder].respond_to?(:dump)
|
30
|
+
options[:encoder].dump(data)
|
31
|
+
else
|
32
|
+
::JSON.generate(data)
|
33
|
+
end
|
28
34
|
end
|
29
35
|
|
30
36
|
def match_content_type(env)
|
@@ -40,7 +46,16 @@ module Faraday
|
|
40
46
|
end
|
41
47
|
|
42
48
|
def body?(env)
|
43
|
-
|
49
|
+
body = env[:body]
|
50
|
+
case body
|
51
|
+
when true, false
|
52
|
+
true
|
53
|
+
when nil
|
54
|
+
# NOTE: nil can be converted to `"null"`, but this middleware doesn't process `nil` for the compatibility.
|
55
|
+
false
|
56
|
+
else
|
57
|
+
!(body.respond_to?(:to_str) && body.empty?)
|
58
|
+
end
|
44
59
|
end
|
45
60
|
|
46
61
|
def request_type(env)
|
data/lib/faraday/request.rb
CHANGED
@@ -24,13 +24,14 @@ module Faraday
|
|
24
24
|
# @return [String] body
|
25
25
|
# @!attribute options
|
26
26
|
# @return [RequestOptions] options
|
27
|
-
|
28
|
-
# rubocop:disable Style/StructInheritance
|
29
|
-
class Request < Struct.new(:http_method, :path, :params, :headers, :body, :options)
|
30
|
-
# rubocop:enable Style/StructInheritance
|
31
|
-
|
27
|
+
Request = Struct.new(:http_method, :path, :params, :headers, :body, :options) do
|
32
28
|
extend MiddlewareRegistry
|
33
29
|
|
30
|
+
alias_method :member_get, :[]
|
31
|
+
private :member_get
|
32
|
+
alias_method :member_set, :[]=
|
33
|
+
private :member_set
|
34
|
+
|
34
35
|
# @param request_method [String]
|
35
36
|
# @yield [request] for block customization, if block given
|
36
37
|
# @yieldparam request [Request]
|
@@ -41,6 +42,7 @@ module Faraday
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
45
|
+
remove_method :params=
|
44
46
|
# Replace params, preserving the existing hash type.
|
45
47
|
#
|
46
48
|
# @param hash [Hash] new params
|
@@ -48,10 +50,11 @@ module Faraday
|
|
48
50
|
if params
|
49
51
|
params.replace hash
|
50
52
|
else
|
51
|
-
|
53
|
+
member_set(:params, hash)
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
57
|
+
remove_method :headers=
|
55
58
|
# Replace request headers, preserving the existing hash type.
|
56
59
|
#
|
57
60
|
# @param hash [Hash] new headers
|
@@ -59,7 +62,7 @@ module Faraday
|
|
59
62
|
if headers
|
60
63
|
headers.replace hash
|
61
64
|
else
|
62
|
-
|
65
|
+
member_set(:headers, hash)
|
63
66
|
end
|
64
67
|
end
|
65
68
|
|
@@ -11,6 +11,8 @@ module Faraday
|
|
11
11
|
@parser_options = parser_options
|
12
12
|
@content_types = Array(content_type)
|
13
13
|
@preserve_raw = preserve_raw
|
14
|
+
|
15
|
+
process_parser_options
|
14
16
|
end
|
15
17
|
|
16
18
|
def on_complete(env)
|
@@ -27,7 +29,11 @@ module Faraday
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def parse(body)
|
30
|
-
|
32
|
+
return if body.strip.empty?
|
33
|
+
|
34
|
+
decoder, method_name = @decoder_options
|
35
|
+
|
36
|
+
decoder.public_send(method_name, body, @parser_options || {})
|
31
37
|
end
|
32
38
|
|
33
39
|
def parse_response?(env)
|
@@ -47,6 +53,20 @@ module Faraday
|
|
47
53
|
type = type.split(';', 2).first if type.index(';')
|
48
54
|
type
|
49
55
|
end
|
56
|
+
|
57
|
+
def process_parser_options
|
58
|
+
@decoder_options = @parser_options&.delete(:decoder)
|
59
|
+
|
60
|
+
@decoder_options =
|
61
|
+
if @decoder_options.is_a?(Array) && @decoder_options.size >= 2
|
62
|
+
@decoder_options.slice(0, 2)
|
63
|
+
elsif @decoder_options&.respond_to?(:load) # rubocop:disable Lint/RedundantSafeNavigation
|
64
|
+
# In some versions of Rails, `nil` responds to `load` - hence the safe navigation check above
|
65
|
+
[@decoder_options, :load]
|
66
|
+
else
|
67
|
+
[::JSON, :parse]
|
68
|
+
end
|
69
|
+
end
|
50
70
|
end
|
51
71
|
end
|
52
72
|
end
|