faraday 1.4.1 → 2.14.2
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 +198 -4
- data/LICENSE.md +1 -1
- data/README.md +34 -20
- data/Rakefile +6 -1
- data/examples/client_spec.rb +67 -13
- data/examples/client_test.rb +81 -16
- data/lib/faraday/adapter/test.rb +117 -52
- data/lib/faraday/adapter.rb +12 -20
- data/lib/faraday/connection.rb +86 -134
- data/lib/faraday/encoders/flat_params_encoder.rb +3 -2
- data/lib/faraday/encoders/nested_params_encoder.rb +15 -7
- data/lib/faraday/error.rb +65 -15
- data/lib/faraday/logging/formatter.rb +30 -17
- data/lib/faraday/middleware.rb +44 -3
- data/lib/faraday/middleware_registry.rb +17 -63
- data/lib/faraday/options/connection_options.rb +7 -6
- data/lib/faraday/options/env.rb +88 -65
- data/lib/faraday/options/proxy_options.rb +17 -6
- data/lib/faraday/options/request_options.rb +8 -7
- data/lib/faraday/options/ssl_options.rb +62 -45
- data/lib/faraday/options.rb +8 -7
- data/lib/faraday/rack_builder.rb +46 -47
- data/lib/faraday/request/authorization.rb +37 -38
- data/lib/faraday/request/instrumentation.rb +5 -1
- data/lib/faraday/request/json.rb +70 -0
- data/lib/faraday/request/url_encoded.rb +5 -1
- data/lib/faraday/request.rb +20 -37
- data/lib/faraday/response/json.rb +74 -0
- data/lib/faraday/response/logger.rb +13 -7
- data/lib/faraday/response/raise_error.rb +45 -18
- data/lib/faraday/response.rb +15 -21
- data/lib/faraday/utils/headers.rb +18 -7
- data/lib/faraday/utils.rb +11 -7
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +12 -32
- data/spec/faraday/adapter/test_spec.rb +182 -0
- data/spec/faraday/connection_spec.rb +219 -92
- data/spec/faraday/error_spec.rb +122 -7
- data/spec/faraday/middleware_registry_spec.rb +31 -0
- data/spec/faraday/middleware_spec.rb +163 -2
- data/spec/faraday/options/env_spec.rb +8 -2
- data/spec/faraday/options/options_spec.rb +1 -1
- data/spec/faraday/options/proxy_options_spec.rb +42 -0
- data/spec/faraday/params_encoders/nested_spec.rb +10 -1
- data/spec/faraday/rack_builder_spec.rb +26 -54
- data/spec/faraday/request/authorization_spec.rb +54 -24
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/json_spec.rb +199 -0
- data/spec/faraday/request/url_encoded_spec.rb +12 -2
- data/spec/faraday/request_spec.rb +14 -15
- data/spec/faraday/response/json_spec.rb +206 -0
- data/spec/faraday/response/logger_spec.rb +84 -5
- data/spec/faraday/response/raise_error_spec.rb +133 -16
- data/spec/faraday/response_spec.rb +10 -1
- data/spec/faraday/utils/headers_spec.rb +31 -4
- data/spec/faraday/utils_spec.rb +66 -2
- data/spec/faraday_spec.rb +10 -4
- data/spec/spec_helper.rb +6 -5
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/faraday_middleware_subclasses.rb +18 -0
- 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 +27 -81
- data/lib/faraday/adapter/em_http.rb +0 -289
- data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -62
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -69
- data/lib/faraday/adapter/em_synchrony.rb +0 -153
- data/lib/faraday/adapter/httpclient.rb +0 -152
- data/lib/faraday/adapter/patron.rb +0 -132
- data/lib/faraday/adapter/rack.rb +0 -75
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -92
- data/lib/faraday/dependency_loader.rb +0 -37
- data/lib/faraday/file_part.rb +0 -128
- data/lib/faraday/param_part.rb +0 -53
- data/lib/faraday/request/basic_authentication.rb +0 -20
- data/lib/faraday/request/multipart.rb +0 -106
- data/lib/faraday/request/retry.rb +0 -239
- data/lib/faraday/request/token_authentication.rb +0 -20
- data/spec/faraday/adapter/em_http_spec.rb +0 -47
- data/spec/faraday/adapter/em_synchrony_spec.rb +0 -16
- 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/request/multipart_spec.rb +0 -302
- data/spec/faraday/request/retry_spec.rb +0 -242
- data/spec/faraday/response/middleware_spec.rb +0 -68
- data/spec/support/webmock_rack_app.rb +0 -68
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
|
-
|
|
28
|
-
# rubocop:disable Style/StructInheritance
|
|
29
|
-
class Request < Struct.new(
|
|
30
|
-
:http_method, :path, :params, :headers, :body, :options
|
|
31
|
-
)
|
|
32
|
-
# rubocop:enable Style/StructInheritance
|
|
33
|
-
|
|
27
|
+
Request = Struct.new(:http_method, :path, :params, :headers, :body, :options) do
|
|
34
28
|
extend MiddlewareRegistry
|
|
35
29
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
authorization: [:Authorization, 'authorization'],
|
|
41
|
-
basic_auth: [
|
|
42
|
-
:BasicAuthentication,
|
|
43
|
-
'basic_authentication'
|
|
44
|
-
],
|
|
45
|
-
token_auth: [
|
|
46
|
-
:TokenAuthentication,
|
|
47
|
-
'token_authentication'
|
|
48
|
-
],
|
|
49
|
-
instrumentation: [:Instrumentation, 'instrumentation']
|
|
30
|
+
alias_method :member_get, :[]
|
|
31
|
+
private :member_get
|
|
32
|
+
alias_method :member_set, :[]=
|
|
33
|
+
private :member_set
|
|
50
34
|
|
|
51
35
|
# @param request_method [String]
|
|
52
36
|
# @yield [request] for block customization, if block given
|
|
@@ -58,14 +42,7 @@ module Faraday
|
|
|
58
42
|
end
|
|
59
43
|
end
|
|
60
44
|
|
|
61
|
-
|
|
62
|
-
warn <<~TEXT
|
|
63
|
-
WARNING: `Faraday::Request##{__method__}` is deprecated; use `#http_method` instead. It will be removed in or after version 2.0.
|
|
64
|
-
`Faraday::Request##{__method__}` called from #{caller_locations(1..1).first}
|
|
65
|
-
TEXT
|
|
66
|
-
http_method
|
|
67
|
-
end
|
|
68
|
-
|
|
45
|
+
remove_method :params=
|
|
69
46
|
# Replace params, preserving the existing hash type.
|
|
70
47
|
#
|
|
71
48
|
# @param hash [Hash] new params
|
|
@@ -73,10 +50,11 @@ module Faraday
|
|
|
73
50
|
if params
|
|
74
51
|
params.replace hash
|
|
75
52
|
else
|
|
76
|
-
|
|
53
|
+
member_set(:params, hash)
|
|
77
54
|
end
|
|
78
55
|
end
|
|
79
56
|
|
|
57
|
+
remove_method :headers=
|
|
80
58
|
# Replace request headers, preserving the existing hash type.
|
|
81
59
|
#
|
|
82
60
|
# @param hash [Hash] new headers
|
|
@@ -84,7 +62,7 @@ module Faraday
|
|
|
84
62
|
if headers
|
|
85
63
|
headers.replace hash
|
|
86
64
|
else
|
|
87
|
-
|
|
65
|
+
member_set(:headers, hash)
|
|
88
66
|
end
|
|
89
67
|
end
|
|
90
68
|
|
|
@@ -140,11 +118,11 @@ module Faraday
|
|
|
140
118
|
# @param serialised [Hash] the serialised object.
|
|
141
119
|
def marshal_load(serialised)
|
|
142
120
|
self.http_method = serialised[:http_method]
|
|
143
|
-
self.body
|
|
144
|
-
self.headers
|
|
145
|
-
self.path
|
|
146
|
-
self.params
|
|
147
|
-
self.options
|
|
121
|
+
self.body = serialised[:body]
|
|
122
|
+
self.headers = serialised[:headers]
|
|
123
|
+
self.path = serialised[:path]
|
|
124
|
+
self.params = serialised[:params]
|
|
125
|
+
self.options = serialised[:options]
|
|
148
126
|
end
|
|
149
127
|
|
|
150
128
|
# @return [Env] the Env for this Request
|
|
@@ -154,3 +132,8 @@ module Faraday
|
|
|
154
132
|
end
|
|
155
133
|
end
|
|
156
134
|
end
|
|
135
|
+
|
|
136
|
+
require 'faraday/request/authorization'
|
|
137
|
+
require 'faraday/request/instrumentation'
|
|
138
|
+
require 'faraday/request/json'
|
|
139
|
+
require 'faraday/request/url_encoded'
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Faraday
|
|
6
|
+
class Response
|
|
7
|
+
# Parse response bodies as JSON.
|
|
8
|
+
class Json < Middleware
|
|
9
|
+
def initialize(app = nil, parser_options: nil, content_type: /\bjson$/, preserve_raw: false)
|
|
10
|
+
super(app)
|
|
11
|
+
@parser_options = parser_options
|
|
12
|
+
@content_types = Array(content_type)
|
|
13
|
+
@preserve_raw = preserve_raw
|
|
14
|
+
|
|
15
|
+
process_parser_options
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def on_complete(env)
|
|
19
|
+
process_response(env) if parse_response?(env)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def process_response(env)
|
|
25
|
+
env[:raw_body] = env[:body] if @preserve_raw
|
|
26
|
+
env[:body] = parse(env[:body])
|
|
27
|
+
rescue StandardError, SyntaxError => e
|
|
28
|
+
raise Faraday::ParsingError.new(e, env[:response])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def parse(body)
|
|
32
|
+
return if body.strip.empty?
|
|
33
|
+
|
|
34
|
+
decoder, method_name = @decoder_options
|
|
35
|
+
|
|
36
|
+
decoder.public_send(method_name, body, @parser_options || {})
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def parse_response?(env)
|
|
40
|
+
process_response_type?(env) &&
|
|
41
|
+
env[:body].respond_to?(:to_str)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def process_response_type?(env)
|
|
45
|
+
type = response_type(env)
|
|
46
|
+
@content_types.empty? || @content_types.any? do |pattern|
|
|
47
|
+
pattern.is_a?(Regexp) ? type.match?(pattern) : type == pattern
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def response_type(env)
|
|
52
|
+
type = env[:response_headers][CONTENT_TYPE].to_s
|
|
53
|
+
type = type.split(';', 2).first if type.index(';')
|
|
54
|
+
type
|
|
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
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
Faraday::Response.register_middleware(json: Faraday::Response::Json)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'forwardable'
|
|
4
|
+
require 'logger'
|
|
4
5
|
require 'faraday/logging/formatter'
|
|
5
6
|
|
|
6
7
|
module Faraday
|
|
@@ -9,14 +10,13 @@ module Faraday
|
|
|
9
10
|
# lifecycle to a given Logger object. By default, this logs to STDOUT. See
|
|
10
11
|
# Faraday::Logging::Formatter to see specifically what is logged.
|
|
11
12
|
class Logger < Middleware
|
|
13
|
+
DEFAULT_OPTIONS = { formatter: Logging::Formatter }.merge(Logging::Formatter::DEFAULT_OPTIONS).freeze
|
|
14
|
+
|
|
12
15
|
def initialize(app, logger = nil, options = {})
|
|
13
|
-
super(app)
|
|
14
|
-
logger ||=
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
end
|
|
18
|
-
formatter_class = options.delete(:formatter) || Logging::Formatter
|
|
19
|
-
@formatter = formatter_class.new(logger: logger, options: options)
|
|
16
|
+
super(app, options)
|
|
17
|
+
logger ||= ::Logger.new($stdout)
|
|
18
|
+
formatter_class = @options.delete(:formatter)
|
|
19
|
+
@formatter = formatter_class.new(logger: logger, options: @options)
|
|
20
20
|
yield @formatter if block_given?
|
|
21
21
|
end
|
|
22
22
|
|
|
@@ -28,6 +28,12 @@ module Faraday
|
|
|
28
28
|
def on_complete(env)
|
|
29
29
|
@formatter.response(env)
|
|
30
30
|
end
|
|
31
|
+
|
|
32
|
+
def on_error(exc)
|
|
33
|
+
@formatter.exception(exc) if @formatter.respond_to?(:exception)
|
|
34
|
+
end
|
|
31
35
|
end
|
|
32
36
|
end
|
|
33
37
|
end
|
|
38
|
+
|
|
39
|
+
Faraday::Response.register_middleware(logger: Faraday::Response::Logger)
|
|
@@ -6,28 +6,32 @@ module Faraday
|
|
|
6
6
|
# client or server error responses.
|
|
7
7
|
class RaiseError < Middleware
|
|
8
8
|
# rubocop:disable Naming/ConstantName
|
|
9
|
-
ClientErrorStatuses = (400...500)
|
|
10
|
-
ServerErrorStatuses = (500...600)
|
|
9
|
+
ClientErrorStatuses = (400...500)
|
|
10
|
+
ServerErrorStatuses = (500...600)
|
|
11
|
+
ClientErrorStatusesWithCustomExceptions = {
|
|
12
|
+
400 => Faraday::BadRequestError,
|
|
13
|
+
401 => Faraday::UnauthorizedError,
|
|
14
|
+
403 => Faraday::ForbiddenError,
|
|
15
|
+
404 => Faraday::ResourceNotFound,
|
|
16
|
+
408 => Faraday::RequestTimeoutError,
|
|
17
|
+
409 => Faraday::ConflictError,
|
|
18
|
+
422 => Faraday::UnprocessableContentError,
|
|
19
|
+
429 => Faraday::TooManyRequestsError
|
|
20
|
+
}.freeze
|
|
11
21
|
# rubocop:enable Naming/ConstantName
|
|
12
22
|
|
|
23
|
+
DEFAULT_OPTIONS = { include_request: true, allowed_statuses: [] }.freeze
|
|
24
|
+
|
|
13
25
|
def on_complete(env)
|
|
26
|
+
return if Array(options[:allowed_statuses]).include?(env[:status])
|
|
27
|
+
|
|
14
28
|
case env[:status]
|
|
15
|
-
when
|
|
16
|
-
raise
|
|
17
|
-
when 401
|
|
18
|
-
raise Faraday::UnauthorizedError, response_values(env)
|
|
19
|
-
when 403
|
|
20
|
-
raise Faraday::ForbiddenError, response_values(env)
|
|
21
|
-
when 404
|
|
22
|
-
raise Faraday::ResourceNotFound, response_values(env)
|
|
29
|
+
when *ClientErrorStatusesWithCustomExceptions.keys
|
|
30
|
+
raise ClientErrorStatusesWithCustomExceptions[env[:status]], response_values(env)
|
|
23
31
|
when 407
|
|
24
32
|
# mimic the behavior that we get with proxy requests with HTTPS
|
|
25
33
|
msg = %(407 "Proxy Authentication Required")
|
|
26
34
|
raise Faraday::ProxyAuthError.new(msg, response_values(env))
|
|
27
|
-
when 409
|
|
28
|
-
raise Faraday::ConflictError, response_values(env)
|
|
29
|
-
when 422
|
|
30
|
-
raise Faraday::UnprocessableEntityError, response_values(env)
|
|
31
35
|
when ClientErrorStatuses
|
|
32
36
|
raise Faraday::ClientError, response_values(env)
|
|
33
37
|
when ServerErrorStatuses
|
|
@@ -37,20 +41,43 @@ module Faraday
|
|
|
37
41
|
end
|
|
38
42
|
end
|
|
39
43
|
|
|
44
|
+
# Returns a hash of response data with the following keys:
|
|
45
|
+
# - status
|
|
46
|
+
# - headers
|
|
47
|
+
# - body
|
|
48
|
+
# - request
|
|
49
|
+
#
|
|
50
|
+
# The `request` key is omitted when the middleware is explicitly
|
|
51
|
+
# configured with the option `include_request: false`.
|
|
40
52
|
def response_values(env)
|
|
41
|
-
{
|
|
53
|
+
response = {
|
|
42
54
|
status: env.status,
|
|
43
55
|
headers: env.response_headers,
|
|
44
|
-
body: env.body
|
|
56
|
+
body: env.body
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Include the request data by default. If the middleware was explicitly
|
|
60
|
+
# configured to _not_ include request data, then omit it.
|
|
61
|
+
return response unless options[:include_request]
|
|
62
|
+
|
|
63
|
+
response.merge(
|
|
45
64
|
request: {
|
|
46
65
|
method: env.method,
|
|
66
|
+
url: env.url,
|
|
47
67
|
url_path: env.url.path,
|
|
48
|
-
params: env
|
|
68
|
+
params: query_params(env),
|
|
49
69
|
headers: env.request_headers,
|
|
50
70
|
body: env.request_body
|
|
51
71
|
}
|
|
52
|
-
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def query_params(env)
|
|
76
|
+
env.request.params_encoder ||= Faraday::Utils.default_params_encoder
|
|
77
|
+
env.params_encoder.decode(env.url.query)
|
|
53
78
|
end
|
|
54
79
|
end
|
|
55
80
|
end
|
|
56
81
|
end
|
|
82
|
+
|
|
83
|
+
Faraday::Response.register_middleware(raise_error: Faraday::Response::RaiseError)
|
data/lib/faraday/response.rb
CHANGED
|
@@ -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,21 +26,26 @@ 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
|
|
48
33
|
finished? ? env.body : nil
|
|
49
34
|
end
|
|
50
35
|
|
|
36
|
+
def url
|
|
37
|
+
finished? ? env.url : nil
|
|
38
|
+
end
|
|
39
|
+
|
|
51
40
|
def finished?
|
|
52
41
|
!!env
|
|
53
42
|
end
|
|
54
43
|
|
|
55
44
|
def on_complete(&block)
|
|
56
|
-
if
|
|
57
|
-
@on_complete_callbacks << block
|
|
58
|
-
else
|
|
45
|
+
if finished?
|
|
59
46
|
yield(env)
|
|
47
|
+
else
|
|
48
|
+
@on_complete_callbacks << block
|
|
60
49
|
end
|
|
61
50
|
self
|
|
62
51
|
end
|
|
@@ -75,8 +64,9 @@ module Faraday
|
|
|
75
64
|
|
|
76
65
|
def to_hash
|
|
77
66
|
{
|
|
78
|
-
status:
|
|
79
|
-
response_headers:
|
|
67
|
+
status: status, body: body,
|
|
68
|
+
response_headers: headers,
|
|
69
|
+
url: url
|
|
80
70
|
}
|
|
81
71
|
end
|
|
82
72
|
|
|
@@ -99,3 +89,7 @@ module Faraday
|
|
|
99
89
|
end
|
|
100
90
|
end
|
|
101
91
|
end
|
|
92
|
+
|
|
93
|
+
require 'faraday/response/json'
|
|
94
|
+
require 'faraday/response/logger'
|
|
95
|
+
require 'faraday/response/raise_error'
|
|
@@ -51,7 +51,7 @@ module Faraday
|
|
|
51
51
|
|
|
52
52
|
def [](key)
|
|
53
53
|
key = KeyMap[key]
|
|
54
|
-
super
|
|
54
|
+
super || super(@names[key.downcase])
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def []=(key, val)
|
|
@@ -59,13 +59,13 @@ module Faraday
|
|
|
59
59
|
key = (@names[key.downcase] ||= key)
|
|
60
60
|
# join multiple values with a comma
|
|
61
61
|
val = val.to_ary.join(', ') if val.respond_to?(:to_ary)
|
|
62
|
-
super
|
|
62
|
+
super
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
def fetch(key,
|
|
65
|
+
def fetch(key, ...)
|
|
66
66
|
key = KeyMap[key]
|
|
67
67
|
key = @names.fetch(key.downcase, key)
|
|
68
|
-
super
|
|
68
|
+
super
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def delete(key)
|
|
@@ -74,7 +74,13 @@ module Faraday
|
|
|
74
74
|
return unless key
|
|
75
75
|
|
|
76
76
|
@names.delete key.downcase
|
|
77
|
-
super
|
|
77
|
+
super
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def dig(key, *rest)
|
|
81
|
+
key = KeyMap[key]
|
|
82
|
+
key = @names.fetch(key.downcase, key)
|
|
83
|
+
super
|
|
78
84
|
end
|
|
79
85
|
|
|
80
86
|
def include?(key)
|
|
@@ -111,7 +117,7 @@ module Faraday
|
|
|
111
117
|
def parse(header_string)
|
|
112
118
|
return unless header_string && !header_string.empty?
|
|
113
119
|
|
|
114
|
-
headers = header_string.split(
|
|
120
|
+
headers = header_string.split("\r\n")
|
|
115
121
|
|
|
116
122
|
# Find the last set of response headers.
|
|
117
123
|
start_index = headers.rindex { |x| x.start_with?('HTTP/') } || 0
|
|
@@ -132,7 +138,12 @@ module Faraday
|
|
|
132
138
|
|
|
133
139
|
# Join multiple values with a comma.
|
|
134
140
|
def add_parsed(key, value)
|
|
135
|
-
|
|
141
|
+
if key?(key)
|
|
142
|
+
self[key] = self[key].to_s
|
|
143
|
+
self[key] << ', ' << value
|
|
144
|
+
else
|
|
145
|
+
self[key] = value
|
|
146
|
+
end
|
|
136
147
|
end
|
|
137
148
|
end
|
|
138
149
|
end
|
data/lib/faraday/utils.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'uri'
|
|
3
4
|
require 'faraday/utils/headers'
|
|
4
5
|
require 'faraday/utils/params_hash'
|
|
5
6
|
|
|
@@ -24,7 +25,7 @@ module Faraday
|
|
|
24
25
|
attr_writer :default_space_encoding
|
|
25
26
|
end
|
|
26
27
|
|
|
27
|
-
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]
|
|
28
|
+
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/
|
|
28
29
|
|
|
29
30
|
def escape(str)
|
|
30
31
|
str.to_s.gsub(ESCAPE_RE) do |match|
|
|
@@ -36,7 +37,7 @@ module Faraday
|
|
|
36
37
|
CGI.unescape str.to_s
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
DEFAULT_SEP = /[&;] */n
|
|
40
|
+
DEFAULT_SEP = /[&;] */n
|
|
40
41
|
|
|
41
42
|
# Adapted from Rack
|
|
42
43
|
def parse_query(query)
|
|
@@ -51,6 +52,12 @@ module Faraday
|
|
|
51
52
|
@default_params_encoder ||= NestedParamsEncoder
|
|
52
53
|
end
|
|
53
54
|
|
|
55
|
+
def basic_header_from(login, pass)
|
|
56
|
+
value = ["#{login}:#{pass}"].pack('m') # Base64 encoding
|
|
57
|
+
value.delete!("\n")
|
|
58
|
+
"Basic #{value}"
|
|
59
|
+
end
|
|
60
|
+
|
|
54
61
|
class << self
|
|
55
62
|
attr_writer :default_params_encoder
|
|
56
63
|
end
|
|
@@ -71,10 +78,7 @@ module Faraday
|
|
|
71
78
|
end
|
|
72
79
|
|
|
73
80
|
def default_uri_parser
|
|
74
|
-
@default_uri_parser ||=
|
|
75
|
-
require 'uri'
|
|
76
|
-
Kernel.method(:URI)
|
|
77
|
-
end
|
|
81
|
+
@default_uri_parser ||= Kernel.method(:URI)
|
|
78
82
|
end
|
|
79
83
|
|
|
80
84
|
def default_uri_parser=(parser)
|
|
@@ -96,7 +100,7 @@ module Faraday
|
|
|
96
100
|
# Recursive hash update
|
|
97
101
|
def deep_merge!(target, hash)
|
|
98
102
|
hash.each do |key, value|
|
|
99
|
-
target[key] = if value.is_a?(Hash) && target[key].is_a?(Hash)
|
|
103
|
+
target[key] = if value.is_a?(Hash) && (target[key].is_a?(Hash) || target[key].is_a?(Options))
|
|
100
104
|
deep_merge(target[key], value)
|
|
101
105
|
else
|
|
102
106
|
value
|
data/lib/faraday/version.rb
CHANGED
data/lib/faraday.rb
CHANGED
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'cgi'
|
|
3
|
+
require 'cgi/escape'
|
|
4
|
+
require 'cgi/util' if RUBY_VERSION < '3.5'
|
|
4
5
|
require 'date'
|
|
5
6
|
require 'set'
|
|
6
7
|
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
8
|
require 'faraday/version'
|
|
16
9
|
require 'faraday/methods'
|
|
10
|
+
require 'faraday/error'
|
|
11
|
+
require 'faraday/middleware_registry'
|
|
17
12
|
require 'faraday/utils'
|
|
18
13
|
require 'faraday/options'
|
|
19
14
|
require 'faraday/connection'
|
|
@@ -23,14 +18,7 @@ require 'faraday/middleware'
|
|
|
23
18
|
require 'faraday/adapter'
|
|
24
19
|
require 'faraday/request'
|
|
25
20
|
require 'faraday/response'
|
|
26
|
-
require 'faraday/error'
|
|
27
|
-
require 'faraday/file_part'
|
|
28
|
-
require 'faraday/param_part'
|
|
29
|
-
|
|
30
21
|
require 'faraday/net_http'
|
|
31
|
-
require 'faraday/net_http_persistent'
|
|
32
|
-
require 'faraday/excon'
|
|
33
|
-
|
|
34
22
|
# This is the main namespace for Faraday.
|
|
35
23
|
#
|
|
36
24
|
# It provides methods to create {Connection} objects, and HTTP-related
|
|
@@ -44,6 +32,8 @@ require 'faraday/excon'
|
|
|
44
32
|
# conn.get '/'
|
|
45
33
|
#
|
|
46
34
|
module Faraday
|
|
35
|
+
CONTENT_TYPE = 'Content-Type'
|
|
36
|
+
|
|
47
37
|
class << self
|
|
48
38
|
# The root path that Faraday is being loaded from.
|
|
49
39
|
#
|
|
@@ -65,6 +55,10 @@ module Faraday
|
|
|
65
55
|
# @return [Symbol] the new default_adapter.
|
|
66
56
|
attr_reader :default_adapter
|
|
67
57
|
|
|
58
|
+
# Option for the default_adapter
|
|
59
|
+
# @return [Hash] default_adapter options
|
|
60
|
+
attr_accessor :default_adapter_options
|
|
61
|
+
|
|
68
62
|
# Documented below, see default_connection
|
|
69
63
|
attr_writer :default_connection
|
|
70
64
|
|
|
@@ -101,23 +95,10 @@ module Faraday
|
|
|
101
95
|
# params: { page: 1 }
|
|
102
96
|
# # => Faraday::Connection to http://faraday.com?page=1
|
|
103
97
|
def new(url = nil, options = {}, &block)
|
|
104
|
-
options =
|
|
98
|
+
options = Utils.deep_merge(default_connection_options, options)
|
|
105
99
|
Faraday::Connection.new(url, options, &block)
|
|
106
100
|
end
|
|
107
101
|
|
|
108
|
-
# @private
|
|
109
|
-
# Internal: Requires internal Faraday libraries.
|
|
110
|
-
#
|
|
111
|
-
# @param libs [Array] one or more relative String names to Faraday classes.
|
|
112
|
-
# @return [void]
|
|
113
|
-
def require_libs(*libs)
|
|
114
|
-
libs.each do |lib|
|
|
115
|
-
require "#{lib_path}/#{lib}"
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
alias require_lib require_libs
|
|
120
|
-
|
|
121
102
|
# Documented elsewhere, see default_adapter reader
|
|
122
103
|
def default_adapter=(adapter)
|
|
123
104
|
@default_connection = nil
|
|
@@ -173,6 +154,5 @@ module Faraday
|
|
|
173
154
|
self.root_path = File.expand_path __dir__
|
|
174
155
|
self.lib_path = File.expand_path 'faraday', __dir__
|
|
175
156
|
self.default_adapter = :net_http
|
|
176
|
-
|
|
177
|
-
require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
|
|
157
|
+
self.default_adapter_options = {}
|
|
178
158
|
end
|