faraday 1.10.4 → 2.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +117 -1
- data/README.md +16 -9
- data/examples/client_spec.rb +1 -1
- data/examples/client_test.rb +2 -2
- data/lib/faraday/adapter/test.rb +2 -0
- data/lib/faraday/adapter.rb +2 -5
- data/lib/faraday/connection.rb +5 -86
- data/lib/faraday/encoders/nested_params_encoder.rb +2 -2
- data/lib/faraday/error.rb +3 -2
- data/lib/faraday/logging/formatter.rb +1 -0
- data/lib/faraday/middleware.rb +0 -1
- data/lib/faraday/middleware_registry.rb +15 -79
- data/lib/faraday/options.rb +3 -3
- data/lib/faraday/rack_builder.rb +21 -18
- data/lib/faraday/request/authorization.rb +28 -41
- data/lib/faraday/request/instrumentation.rb +2 -0
- data/lib/faraday/request/url_encoded.rb +2 -0
- data/lib/faraday/request.rb +6 -24
- data/lib/faraday/response/json.rb +4 -4
- data/lib/faraday/response/logger.rb +2 -0
- data/lib/faraday/response/raise_error.rb +9 -1
- data/lib/faraday/response.rb +7 -20
- data/lib/faraday/utils/headers.rb +1 -1
- data/lib/faraday/utils.rb +10 -5
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +4 -46
- data/spec/faraday/connection_spec.rb +102 -51
- data/spec/faraday/options/env_spec.rb +2 -2
- data/spec/faraday/rack_builder_spec.rb +7 -50
- data/spec/faraday/request/authorization_spec.rb +19 -32
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/url_encoded_spec.rb +0 -1
- data/spec/faraday/request_spec.rb +0 -11
- data/spec/faraday/response/json_spec.rb +4 -6
- data/spec/faraday/response/raise_error_spec.rb +7 -4
- data/spec/faraday/utils_spec.rb +62 -1
- data/spec/spec_helper.rb +0 -2
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/helper_methods.rb +0 -37
- data/spec/support/shared_examples/adapter.rb +0 -1
- data/spec/support/shared_examples/request_method.rb +5 -18
- metadata +4 -162
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -89
- data/lib/faraday/dependency_loader.rb +0 -39
- data/lib/faraday/deprecate.rb +0 -110
- 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/deprecate_spec.rb +0 -147
- data/spec/faraday/response/middleware_spec.rb +0 -68
- data/spec/support/webmock_rack_app.rb +0 -68
data/lib/faraday/rack_builder.rb
CHANGED
@@ -58,22 +58,21 @@ 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
|
-
yield(self) if block_given?
|
75
|
+
block_given? ? yield(self) : request(:url_encoded)
|
77
76
|
adapter(Faraday.default_adapter) unless @adapter
|
78
77
|
end
|
79
78
|
|
@@ -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,27 @@ 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, *@params)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# @param type [String, Symbol]
|
32
|
+
# @param params [Array]
|
33
|
+
# @return [String] a header value
|
34
|
+
def header_from(type, *params)
|
35
|
+
if type.to_s.casecmp('basic').zero? && params.size == 2
|
36
|
+
Utils.basic_header_from(*params)
|
37
|
+
elsif params.size != 1
|
38
|
+
raise ArgumentError, "Unexpected params received (got #{params.size} instead of 1)"
|
39
|
+
else
|
40
|
+
value = params.first
|
41
|
+
value = value.call if value.is_a?(Proc) || value.respond_to?(:call)
|
42
|
+
"#{type} #{value}"
|
43
|
+
end
|
59
44
|
end
|
60
45
|
end
|
61
46
|
end
|
62
47
|
end
|
48
|
+
|
49
|
+
Faraday::Request.register_middleware(authorization: Faraday::Request::Authorization)
|
data/lib/faraday/request.rb
CHANGED
@@ -26,27 +26,11 @@ module Faraday
|
|
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,13 +41,6 @@ module Faraday
|
|
57
41
|
end
|
58
42
|
end
|
59
43
|
|
60
|
-
def method
|
61
|
-
http_method
|
62
|
-
end
|
63
|
-
|
64
|
-
extend Faraday::Deprecate
|
65
|
-
deprecate :method, :http_method, '2.0'
|
66
|
-
|
67
44
|
# Replace params, preserving the existing hash type.
|
68
45
|
#
|
69
46
|
# @param hash [Hash] new params
|
@@ -152,3 +129,8 @@ module Faraday
|
|
152
129
|
end
|
153
130
|
end
|
154
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)
|
@@ -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
|
@@ -101,3 +84,7 @@ module Faraday
|
|
101
84
|
end
|
102
85
|
end
|
103
86
|
end
|
87
|
+
|
88
|
+
require 'faraday/response/json'
|
89
|
+
require 'faraday/response/logger'
|
90
|
+
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
|
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 ||=
|
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
|
data/lib/faraday/version.rb
CHANGED
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,26 +17,6 @@ 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/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
20
|
|
47
21
|
# This is the main namespace for Faraday.
|
48
22
|
#
|
@@ -73,7 +47,7 @@ module Faraday
|
|
73
47
|
|
74
48
|
# @overload default_adapter
|
75
49
|
# Gets the Symbol key identifying a default Adapter to use
|
76
|
-
# for the default {Faraday::Connection}. Defaults to `:
|
50
|
+
# for the default {Faraday::Connection}. Defaults to `:test`.
|
77
51
|
# @return [Symbol] the default adapter
|
78
52
|
# @overload default_adapter=(adapter)
|
79
53
|
# Updates default adapter while resetting {.default_connection}.
|
@@ -116,23 +90,10 @@ module Faraday
|
|
116
90
|
# params: { page: 1 }
|
117
91
|
# # => Faraday::Connection to http://faraday.com?page=1
|
118
92
|
def new(url = nil, options = {}, &block)
|
119
|
-
options =
|
93
|
+
options = Utils.deep_merge(default_connection_options, options)
|
120
94
|
Faraday::Connection.new(url, options, &block)
|
121
95
|
end
|
122
96
|
|
123
|
-
# @private
|
124
|
-
# Internal: Requires internal Faraday libraries.
|
125
|
-
#
|
126
|
-
# @param libs [Array] one or more relative String names to Faraday classes.
|
127
|
-
# @return [void]
|
128
|
-
def require_libs(*libs)
|
129
|
-
libs.each do |lib|
|
130
|
-
require "#{lib_path}/#{lib}"
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
alias require_lib require_libs
|
135
|
-
|
136
97
|
# Documented elsewhere, see default_adapter reader
|
137
98
|
def default_adapter=(adapter)
|
138
99
|
@default_connection = nil
|
@@ -187,7 +148,4 @@ module Faraday
|
|
187
148
|
self.ignore_env_proxy = false
|
188
149
|
self.root_path = File.expand_path __dir__
|
189
150
|
self.lib_path = File.expand_path 'faraday', __dir__
|
190
|
-
self.default_adapter = :net_http
|
191
|
-
|
192
|
-
require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
|
193
151
|
end
|