faraday 1.10.0 → 2.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +197 -3
- data/LICENSE.md +1 -1
- data/README.md +18 -16
- data/examples/client_spec.rb +41 -19
- data/examples/client_test.rb +48 -22
- data/lib/faraday/adapter/test.rb +59 -10
- data/lib/faraday/adapter.rb +5 -9
- data/lib/faraday/connection.rb +47 -129
- data/lib/faraday/encoders/nested_params_encoder.rb +13 -6
- data/lib/faraday/error.rb +3 -2
- data/lib/faraday/logging/formatter.rb +19 -2
- data/lib/faraday/middleware.rb +3 -1
- data/lib/faraday/middleware_registry.rb +17 -63
- data/lib/faraday/options/env.rb +31 -7
- data/lib/faraday/options/ssl_options.rb +11 -1
- data/lib/faraday/options.rb +3 -3
- data/lib/faraday/rack_builder.rb +23 -20
- data/lib/faraday/request/authorization.rb +33 -41
- data/lib/faraday/request/instrumentation.rb +2 -0
- data/lib/faraday/request/url_encoded.rb +5 -1
- data/lib/faraday/request.rb +7 -26
- data/lib/faraday/response/json.rb +4 -4
- data/lib/faraday/response/logger.rb +6 -0
- data/lib/faraday/response/raise_error.rb +9 -1
- data/lib/faraday/response.rb +9 -21
- data/lib/faraday/utils/headers.rb +7 -2
- data/lib/faraday/utils.rb +10 -5
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +8 -44
- data/spec/faraday/adapter/test_spec.rb +65 -0
- data/spec/faraday/connection_spec.rb +163 -91
- data/spec/faraday/middleware_registry_spec.rb +31 -0
- data/spec/faraday/middleware_spec.rb +18 -0
- data/spec/faraday/options/env_spec.rb +8 -2
- data/spec/faraday/params_encoders/nested_spec.rb +8 -0
- data/spec/faraday/rack_builder_spec.rb +26 -54
- data/spec/faraday/request/authorization_spec.rb +50 -28
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/url_encoded_spec.rb +12 -2
- data/spec/faraday/request_spec.rb +5 -15
- data/spec/faraday/response/json_spec.rb +4 -6
- data/spec/faraday/response/logger_spec.rb +28 -0
- data/spec/faraday/response/raise_error_spec.rb +7 -4
- data/spec/faraday/response_spec.rb +3 -1
- data/spec/faraday/utils/headers_spec.rb +22 -4
- data/spec/faraday/utils_spec.rb +63 -1
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/helper_methods.rb +0 -37
- data/spec/support/shared_examples/adapter.rb +2 -2
- data/spec/support/shared_examples/request_method.rb +22 -21
- metadata +14 -149
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -87
- data/lib/faraday/dependency_loader.rb +0 -37
- data/lib/faraday/request/basic_authentication.rb +0 -20
- data/lib/faraday/request/token_authentication.rb +0 -20
- data/spec/faraday/adapter/em_http_spec.rb +0 -49
- data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
- data/spec/faraday/adapter/excon_spec.rb +0 -49
- data/spec/faraday/adapter/httpclient_spec.rb +0 -73
- data/spec/faraday/adapter/net_http_spec.rb +0 -64
- data/spec/faraday/adapter/patron_spec.rb +0 -18
- data/spec/faraday/adapter/rack_spec.rb +0 -8
- data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
- data/spec/faraday/composite_read_io_spec.rb +0 -80
- data/spec/faraday/response/middleware_spec.rb +0 -68
- data/spec/support/webmock_rack_app.rb +0 -68
@@ -6,59 +6,26 @@ module Faraday
|
|
6
6
|
# Adds the ability for other modules to register and lookup
|
7
7
|
# middleware classes.
|
8
8
|
module MiddlewareRegistry
|
9
|
+
def registered_middleware
|
10
|
+
@registered_middleware ||= {}
|
11
|
+
end
|
12
|
+
|
9
13
|
# Register middleware class(es) on the current module.
|
10
14
|
#
|
11
|
-
# @param
|
12
|
-
# @param mapping [Hash{
|
13
|
-
# Symbol => Module,
|
14
|
-
# Symbol => Array<Module, Symbol, String>,
|
15
|
-
# }] Middleware mapping from a lookup symbol to a reference to the
|
16
|
-
# middleware.
|
17
|
-
# Classes can be expressed as:
|
18
|
-
# - a fully qualified constant
|
19
|
-
# - a Symbol
|
20
|
-
# - a Proc that will be lazily called to return the former
|
21
|
-
# - an array is given, its first element is the constant or symbol,
|
22
|
-
# and its second is a file to `require`.
|
15
|
+
# @param mappings [Hash] Middleware mappings from a lookup symbol to a middleware class.
|
23
16
|
# @return [void]
|
24
17
|
#
|
25
18
|
# @example Lookup by a constant
|
26
19
|
#
|
27
20
|
# module Faraday
|
28
|
-
# class Whatever
|
21
|
+
# class Whatever < Middleware
|
29
22
|
# # Middleware looked up by :foo returns Faraday::Whatever::Foo.
|
30
|
-
# register_middleware
|
31
|
-
# end
|
32
|
-
# end
|
33
|
-
#
|
34
|
-
# @example Lookup by a symbol
|
35
|
-
#
|
36
|
-
# module Faraday
|
37
|
-
# class Whatever
|
38
|
-
# # Middleware looked up by :bar returns
|
39
|
-
# # Faraday::Whatever.const_get(:Bar)
|
40
|
-
# register_middleware bar: :Bar
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# @example Lookup by a symbol and string in an array
|
45
|
-
#
|
46
|
-
# module Faraday
|
47
|
-
# class Whatever
|
48
|
-
# # Middleware looked up by :baz requires 'baz' and returns
|
49
|
-
# # Faraday::Whatever.const_get(:Baz)
|
50
|
-
# register_middleware baz: [:Baz, 'baz']
|
23
|
+
# register_middleware(foo: Whatever)
|
51
24
|
# end
|
52
25
|
# end
|
53
|
-
|
54
|
-
def register_middleware(autoload_path = nil, mapping = nil)
|
55
|
-
if mapping.nil?
|
56
|
-
mapping = autoload_path
|
57
|
-
autoload_path = nil
|
58
|
-
end
|
26
|
+
def register_middleware(**mappings)
|
59
27
|
middleware_mutex do
|
60
|
-
|
61
|
-
(@registered_middleware ||= {}).update(mapping)
|
28
|
+
registered_middleware.update(mappings)
|
62
29
|
end
|
63
30
|
end
|
64
31
|
|
@@ -66,7 +33,7 @@ module Faraday
|
|
66
33
|
#
|
67
34
|
# @param key [Symbol] key for the registered middleware.
|
68
35
|
def unregister_middleware(key)
|
69
|
-
|
36
|
+
registered_middleware.delete(key)
|
70
37
|
end
|
71
38
|
|
72
39
|
# Lookup middleware class with a registered Symbol shortcut.
|
@@ -78,30 +45,27 @@ module Faraday
|
|
78
45
|
# @example
|
79
46
|
#
|
80
47
|
# module Faraday
|
81
|
-
# class Whatever
|
82
|
-
# register_middleware
|
48
|
+
# class Whatever < Middleware
|
49
|
+
# register_middleware(foo: Whatever)
|
83
50
|
# end
|
84
51
|
# end
|
85
52
|
#
|
86
|
-
# Faraday::
|
87
|
-
# # => Faraday::Whatever
|
88
|
-
#
|
53
|
+
# Faraday::Middleware.lookup_middleware(:foo)
|
54
|
+
# # => Faraday::Whatever
|
89
55
|
def lookup_middleware(key)
|
90
56
|
load_middleware(key) ||
|
91
57
|
raise(Faraday::Error, "#{key.inspect} is not registered on #{self}")
|
92
58
|
end
|
93
59
|
|
60
|
+
private
|
61
|
+
|
94
62
|
def middleware_mutex(&block)
|
95
63
|
@middleware_mutex ||= Monitor.new
|
96
64
|
@middleware_mutex.synchronize(&block)
|
97
65
|
end
|
98
66
|
|
99
|
-
def fetch_middleware(key)
|
100
|
-
defined?(@registered_middleware) && @registered_middleware[key]
|
101
|
-
end
|
102
|
-
|
103
67
|
def load_middleware(key)
|
104
|
-
value =
|
68
|
+
value = registered_middleware[key]
|
105
69
|
case value
|
106
70
|
when Module
|
107
71
|
value
|
@@ -113,16 +77,6 @@ module Faraday
|
|
113
77
|
middleware_mutex do
|
114
78
|
@registered_middleware[key] = value.call
|
115
79
|
end
|
116
|
-
when Array
|
117
|
-
middleware_mutex do
|
118
|
-
const, path = value
|
119
|
-
if (root = @middleware_autoload_path)
|
120
|
-
path = "#{root}/#{path}"
|
121
|
-
end
|
122
|
-
require(path)
|
123
|
-
@registered_middleware[key] = const
|
124
|
-
end
|
125
|
-
load_middleware(key)
|
126
80
|
end
|
127
81
|
end
|
128
82
|
end
|
data/lib/faraday/options/env.rb
CHANGED
@@ -15,13 +15,19 @@ module Faraday
|
|
15
15
|
# @return [Hash] options for configuring the request.
|
16
16
|
# Options for configuring the request.
|
17
17
|
#
|
18
|
-
# - `:timeout`
|
19
|
-
#
|
20
|
-
# - `:
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
18
|
+
# - `:timeout` - time limit for the entire request (Integer in
|
19
|
+
# seconds)
|
20
|
+
# - `:open_timeout` - time limit for just the connection phase (e.g.
|
21
|
+
# handshake) (Integer in seconds)
|
22
|
+
# - `:read_timeout` - time limit for the first response byte received from
|
23
|
+
# the server (Integer in seconds)
|
24
|
+
# - `:write_timeout` - time limit for the client to send the request to the
|
25
|
+
# server (Integer in seconds)
|
26
|
+
# - `:on_data` - Proc for streaming
|
27
|
+
# - `:proxy` - Hash of proxy options
|
28
|
+
# - `:uri` - Proxy server URI
|
29
|
+
# - `:user` - Proxy server username
|
30
|
+
# - `:password` - Proxy server password
|
25
31
|
#
|
26
32
|
# @!attribute request_headers
|
27
33
|
# @return [Hash] HTTP Headers to be sent to the server.
|
@@ -157,6 +163,24 @@ module Faraday
|
|
157
163
|
%(#<#{self.class}#{attrs.join(' ')}>)
|
158
164
|
end
|
159
165
|
|
166
|
+
def stream_response?
|
167
|
+
request.stream_response?
|
168
|
+
end
|
169
|
+
|
170
|
+
def stream_response(&block)
|
171
|
+
size = 0
|
172
|
+
yielded = false
|
173
|
+
block_result = block.call do |chunk| # rubocop:disable Performance/RedundantBlockCall
|
174
|
+
if chunk.bytesize.positive? || size.positive?
|
175
|
+
yielded = true
|
176
|
+
size += chunk.bytesize
|
177
|
+
request.on_data.call(chunk, size, self)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
request.on_data.call(+'', 0, self) unless yielded
|
181
|
+
block_result
|
182
|
+
end
|
183
|
+
|
160
184
|
# @private
|
161
185
|
def custom_members
|
162
186
|
@custom_members ||= {}
|
@@ -6,6 +6,10 @@ module Faraday
|
|
6
6
|
# @!attribute verify
|
7
7
|
# @return [Boolean] whether to verify SSL certificates or not
|
8
8
|
#
|
9
|
+
# @!attribute verify_hostname
|
10
|
+
# @return [Boolean] whether to enable hostname verification on server certificates
|
11
|
+
# during the handshake or not (see https://github.com/ruby/openssl/pull/60)
|
12
|
+
#
|
9
13
|
# @!attribute ca_file
|
10
14
|
# @return [String] CA file
|
11
15
|
#
|
@@ -41,7 +45,8 @@ module Faraday
|
|
41
45
|
#
|
42
46
|
# @!attribute max_version
|
43
47
|
# @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)
|
44
|
-
class SSLOptions < Options.new(:verify, :
|
48
|
+
class SSLOptions < Options.new(:verify, :verify_hostname,
|
49
|
+
:ca_file, :ca_path, :verify_mode,
|
45
50
|
:cert_store, :client_cert, :client_key,
|
46
51
|
:certificate, :private_key, :verify_depth,
|
47
52
|
:version, :min_version, :max_version)
|
@@ -55,5 +60,10 @@ module Faraday
|
|
55
60
|
def disable?
|
56
61
|
!verify?
|
57
62
|
end
|
63
|
+
|
64
|
+
# @return [Boolean] true if should verify_hostname
|
65
|
+
def verify_hostname?
|
66
|
+
verify_hostname != false
|
67
|
+
end
|
58
68
|
end
|
59
69
|
end
|
data/lib/faraday/options.rb
CHANGED
@@ -104,7 +104,7 @@ module Faraday
|
|
104
104
|
|
105
105
|
# Public
|
106
106
|
def each_key(&block)
|
107
|
-
return to_enum(:each_key) unless
|
107
|
+
return to_enum(:each_key) unless block
|
108
108
|
|
109
109
|
keys.each(&block)
|
110
110
|
end
|
@@ -118,7 +118,7 @@ module Faraday
|
|
118
118
|
|
119
119
|
# Public
|
120
120
|
def each_value(&block)
|
121
|
-
return to_enum(:each_value) unless
|
121
|
+
return to_enum(:each_value) unless block
|
122
122
|
|
123
123
|
values.each(&block)
|
124
124
|
end
|
@@ -168,7 +168,7 @@ module Faraday
|
|
168
168
|
end
|
169
169
|
|
170
170
|
def self.memoized(key, &block)
|
171
|
-
unless
|
171
|
+
unless block
|
172
172
|
raise ArgumentError, '#memoized must be called with a block'
|
173
173
|
end
|
174
174
|
|
data/lib/faraday/rack_builder.rb
CHANGED
@@ -8,7 +8,7 @@ module Faraday
|
|
8
8
|
# middleware stack (heavily inspired by Rack).
|
9
9
|
#
|
10
10
|
# @example
|
11
|
-
# Faraday::Connection.new(url: 'http://
|
11
|
+
# Faraday::Connection.new(url: 'http://httpbingo.org') do |builder|
|
12
12
|
# builder.request :url_encoded # Faraday::Request::UrlEncoded
|
13
13
|
# builder.adapter :net_http # Faraday::Adapter::NetHttp
|
14
14
|
# end
|
@@ -58,23 +58,22 @@ module Faraday
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
def initialize(
|
62
|
-
@adapter =
|
63
|
-
@handlers =
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
61
|
+
def initialize(&block)
|
62
|
+
@adapter = nil
|
63
|
+
@handlers = []
|
64
|
+
build(&block)
|
65
|
+
end
|
66
|
+
|
67
|
+
def initialize_dup(original)
|
68
|
+
super
|
69
|
+
@adapter = original.adapter
|
70
|
+
@handlers = original.handlers.dup
|
71
71
|
end
|
72
72
|
|
73
|
-
def build
|
73
|
+
def build
|
74
74
|
raise_if_locked
|
75
|
-
|
76
|
-
|
77
|
-
adapter(Faraday.default_adapter) unless @adapter
|
75
|
+
block_given? ? yield(self) : request(:url_encoded)
|
76
|
+
adapter(Faraday.default_adapter, **Faraday.default_adapter_options) unless @adapter
|
78
77
|
end
|
79
78
|
|
80
79
|
def [](idx)
|
@@ -109,7 +108,7 @@ module Faraday
|
|
109
108
|
end
|
110
109
|
|
111
110
|
ruby2_keywords def adapter(klass = NO_ARGUMENT, *args, &block)
|
112
|
-
return @adapter if klass == NO_ARGUMENT
|
111
|
+
return @adapter if klass == NO_ARGUMENT || klass.nil?
|
113
112
|
|
114
113
|
klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
|
115
114
|
@adapter = self.class::Handler.new(klass, *args, &block)
|
@@ -164,6 +163,7 @@ module Faraday
|
|
164
163
|
def app
|
165
164
|
@app ||= begin
|
166
165
|
lock!
|
166
|
+
ensure_adapter!
|
167
167
|
to_app
|
168
168
|
end
|
169
169
|
end
|
@@ -182,10 +182,6 @@ module Faraday
|
|
182
182
|
@adapter == other.adapter
|
183
183
|
end
|
184
184
|
|
185
|
-
def dup
|
186
|
-
self.class.new(@handlers.dup, @adapter.dup)
|
187
|
-
end
|
188
|
-
|
189
185
|
# ENV Keys
|
190
186
|
# :http_method - a symbolized request HTTP method (:get, :post)
|
191
187
|
# :body - the request body that will eventually be converted to a string.
|
@@ -216,6 +212,9 @@ module Faraday
|
|
216
212
|
private
|
217
213
|
|
218
214
|
LOCK_ERR = "can't modify middleware stack after making a request"
|
215
|
+
MISSING_ADAPTER_ERROR = "An attempt to run a request with a Faraday::Connection without adapter has been made.\n" \
|
216
|
+
"Please set Faraday.default_adapter or provide one when initializing the connection.\n" \
|
217
|
+
'For more info, check https://lostisland.github.io/faraday/usage/.'
|
219
218
|
|
220
219
|
def raise_if_locked
|
221
220
|
raise StackLocked, LOCK_ERR if locked?
|
@@ -227,6 +226,10 @@ module Faraday
|
|
227
226
|
raise 'Adapter should be set using the `adapter` method, not `use`'
|
228
227
|
end
|
229
228
|
|
229
|
+
def ensure_adapter!
|
230
|
+
raise MISSING_ADAPTER_ERROR unless @adapter
|
231
|
+
end
|
232
|
+
|
230
233
|
def adapter_set?
|
231
234
|
!@adapter.nil?
|
232
235
|
end
|
@@ -1,53 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'base64'
|
4
|
-
|
5
3
|
module Faraday
|
6
4
|
class Request
|
7
5
|
# Request middleware for the Authorization HTTP header
|
8
6
|
class Authorization < Faraday::Middleware
|
9
|
-
|
10
|
-
KEY = 'Authorization'
|
11
|
-
end
|
12
|
-
|
13
|
-
# @param type [String, Symbol]
|
14
|
-
# @param token [String, Symbol, Hash]
|
15
|
-
# @return [String] a header value
|
16
|
-
def self.header(type, token)
|
17
|
-
case token
|
18
|
-
when String, Symbol, Proc
|
19
|
-
token = token.call if token.is_a?(Proc)
|
20
|
-
"#{type} #{token}"
|
21
|
-
when Hash
|
22
|
-
build_hash(type.to_s, token)
|
23
|
-
else
|
24
|
-
raise ArgumentError,
|
25
|
-
"Can't build an Authorization #{type}" \
|
26
|
-
"header from #{token.inspect}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param type [String]
|
31
|
-
# @param hash [Hash]
|
32
|
-
# @return [String] type followed by comma-separated key=value pairs
|
33
|
-
# @api private
|
34
|
-
def self.build_hash(type, hash)
|
35
|
-
comma = ', '
|
36
|
-
values = []
|
37
|
-
hash.each do |key, value|
|
38
|
-
value = value.call if value.is_a?(Proc)
|
39
|
-
values << "#{key}=#{value.to_s.inspect}"
|
40
|
-
end
|
41
|
-
"#{type} #{values * comma}"
|
42
|
-
end
|
7
|
+
KEY = 'Authorization'
|
43
8
|
|
44
9
|
# @param app [#call]
|
45
10
|
# @param type [String, Symbol] Type of Authorization
|
46
|
-
# @param
|
47
|
-
#
|
48
|
-
|
11
|
+
# @param params [Array<String, Proc, #call>] parameters to build the Authorization header.
|
12
|
+
# If the type is `:basic`, then these can be a login and password pair.
|
13
|
+
# Otherwise, a single value is expected that will be appended after the type.
|
14
|
+
# This value can be a proc or an object responding to `.call`, in which case
|
15
|
+
# it will be invoked on each request.
|
16
|
+
def initialize(app, type, *params)
|
49
17
|
@type = type
|
50
|
-
@
|
18
|
+
@params = params
|
51
19
|
super(app)
|
52
20
|
end
|
53
21
|
|
@@ -55,8 +23,32 @@ module Faraday
|
|
55
23
|
def on_request(env)
|
56
24
|
return if env.request_headers[KEY]
|
57
25
|
|
58
|
-
env.request_headers[KEY] =
|
26
|
+
env.request_headers[KEY] = header_from(@type, env, *@params)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# @param type [String, Symbol]
|
32
|
+
# @param env [Faraday::Env]
|
33
|
+
# @param params [Array]
|
34
|
+
# @return [String] a header value
|
35
|
+
def header_from(type, env, *params)
|
36
|
+
if type.to_s.casecmp('basic').zero? && params.size == 2
|
37
|
+
Utils.basic_header_from(*params)
|
38
|
+
elsif params.size != 1
|
39
|
+
raise ArgumentError, "Unexpected params received (got #{params.size} instead of 1)"
|
40
|
+
else
|
41
|
+
value = params.first
|
42
|
+
if (value.is_a?(Proc) && value.arity == 1) || (value.respond_to?(:call) && value.method(:call).arity == 1)
|
43
|
+
value = value.call(env)
|
44
|
+
elsif value.is_a?(Proc) || value.respond_to?(:call)
|
45
|
+
value = value.call
|
46
|
+
end
|
47
|
+
"#{type} #{value}"
|
48
|
+
end
|
59
49
|
end
|
60
50
|
end
|
61
51
|
end
|
62
52
|
end
|
53
|
+
|
54
|
+
Faraday::Request.register_middleware(authorization: Faraday::Request::Authorization)
|
@@ -31,7 +31,9 @@ module Faraday
|
|
31
31
|
return unless process_request?(env)
|
32
32
|
|
33
33
|
env.request_headers[CONTENT_TYPE] ||= self.class.mime_type
|
34
|
-
|
34
|
+
return if env.body.respond_to?(:to_str) || env.body.respond_to?(:read)
|
35
|
+
|
36
|
+
yield(env.body)
|
35
37
|
end
|
36
38
|
|
37
39
|
# @param env [Faraday::Env]
|
@@ -54,3 +56,5 @@ module Faraday
|
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
59
|
+
|
60
|
+
Faraday::Request.register_middleware(url_encoded: Faraday::Request::UrlEncoded)
|
data/lib/faraday/request.rb
CHANGED
@@ -21,32 +21,16 @@ module Faraday
|
|
21
21
|
# @!attribute headers
|
22
22
|
# @return [Faraday::Utils::Headers] headers
|
23
23
|
# @!attribute body
|
24
|
-
# @return [
|
24
|
+
# @return [String] body
|
25
25
|
# @!attribute options
|
26
26
|
# @return [RequestOptions] options
|
27
27
|
#
|
28
28
|
# rubocop:disable Style/StructInheritance
|
29
|
-
class Request < Struct.new(
|
30
|
-
:http_method, :path, :params, :headers, :body, :options
|
31
|
-
)
|
29
|
+
class Request < Struct.new(:http_method, :path, :params, :headers, :body, :options)
|
32
30
|
# rubocop:enable Style/StructInheritance
|
33
31
|
|
34
32
|
extend MiddlewareRegistry
|
35
33
|
|
36
|
-
register_middleware File.expand_path('request', __dir__),
|
37
|
-
url_encoded: [:UrlEncoded, 'url_encoded'],
|
38
|
-
authorization: [:Authorization, 'authorization'],
|
39
|
-
basic_auth: [
|
40
|
-
:BasicAuthentication,
|
41
|
-
'basic_authentication'
|
42
|
-
],
|
43
|
-
token_auth: [
|
44
|
-
:TokenAuthentication,
|
45
|
-
'token_authentication'
|
46
|
-
],
|
47
|
-
instrumentation: [:Instrumentation, 'instrumentation'],
|
48
|
-
json: [:Json, 'json']
|
49
|
-
|
50
34
|
# @param request_method [String]
|
51
35
|
# @yield [request] for block customization, if block given
|
52
36
|
# @yieldparam request [Request]
|
@@ -57,14 +41,6 @@ module Faraday
|
|
57
41
|
end
|
58
42
|
end
|
59
43
|
|
60
|
-
def method
|
61
|
-
warn <<~TEXT
|
62
|
-
WARNING: `Faraday::Request##{__method__}` is deprecated; use `#http_method` instead. It will be removed in or after version 2.0.
|
63
|
-
`Faraday::Request##{__method__}` called from #{caller_locations(1..1).first}
|
64
|
-
TEXT
|
65
|
-
http_method
|
66
|
-
end
|
67
|
-
|
68
44
|
# Replace params, preserving the existing hash type.
|
69
45
|
#
|
70
46
|
# @param hash [Hash] new params
|
@@ -153,3 +129,8 @@ module Faraday
|
|
153
129
|
end
|
154
130
|
end
|
155
131
|
end
|
132
|
+
|
133
|
+
require 'faraday/request/authorization'
|
134
|
+
require 'faraday/request/instrumentation'
|
135
|
+
require 'faraday/request/json'
|
136
|
+
require 'faraday/request/url_encoded'
|
@@ -6,11 +6,11 @@ module Faraday
|
|
6
6
|
class Response
|
7
7
|
# Parse response bodies as JSON.
|
8
8
|
class Json < Middleware
|
9
|
-
def initialize(app = nil,
|
9
|
+
def initialize(app = nil, parser_options: nil, content_type: /\bjson$/, preserve_raw: false)
|
10
10
|
super(app)
|
11
|
-
@parser_options =
|
12
|
-
@content_types = Array(
|
13
|
-
@preserve_raw =
|
11
|
+
@parser_options = parser_options
|
12
|
+
@content_types = Array(content_type)
|
13
|
+
@preserve_raw = preserve_raw
|
14
14
|
end
|
15
15
|
|
16
16
|
def on_complete(env)
|
@@ -26,6 +26,12 @@ module Faraday
|
|
26
26
|
def on_complete(env)
|
27
27
|
@formatter.response(env)
|
28
28
|
end
|
29
|
+
|
30
|
+
def on_error(exc)
|
31
|
+
@formatter.exception(exc) if @formatter.respond_to?(:exception)
|
32
|
+
end
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
36
|
+
|
37
|
+
Faraday::Response.register_middleware(logger: Faraday::Response::Logger)
|
@@ -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
|
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)
|
data/lib/faraday/response.rb
CHANGED
@@ -5,26 +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
|
-
json: [:Json, 'json']
|
27
|
-
|
28
11
|
def initialize(env = nil)
|
29
12
|
@env = Env.from(env) if env
|
30
13
|
@on_complete_callbacks = []
|
@@ -55,10 +38,10 @@ module Faraday
|
|
55
38
|
end
|
56
39
|
|
57
40
|
def on_complete(&block)
|
58
|
-
if
|
59
|
-
@on_complete_callbacks << block
|
60
|
-
else
|
41
|
+
if finished?
|
61
42
|
yield(env)
|
43
|
+
else
|
44
|
+
@on_complete_callbacks << block
|
62
45
|
end
|
63
46
|
self
|
64
47
|
end
|
@@ -78,7 +61,8 @@ module Faraday
|
|
78
61
|
def to_hash
|
79
62
|
{
|
80
63
|
status: env.status, body: env.body,
|
81
|
-
response_headers: env.response_headers
|
64
|
+
response_headers: env.response_headers,
|
65
|
+
url: env.url
|
82
66
|
}
|
83
67
|
end
|
84
68
|
|
@@ -101,3 +85,7 @@ module Faraday
|
|
101
85
|
end
|
102
86
|
end
|
103
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(
|
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
|
-
|
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
|