faraday 1.9.3 → 2.6.0
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 +11 -9
- data/examples/client_spec.rb +41 -19
- data/examples/client_test.rb +48 -22
- data/lib/faraday/adapter/test.rb +43 -7
- data/lib/faraday/adapter.rb +4 -7
- data/lib/faraday/connection.rb +39 -120
- data/lib/faraday/encoders/nested_params_encoder.rb +13 -6
- 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 +17 -63
- data/lib/faraday/options/env.rb +18 -0
- 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/json.rb +55 -0
- data/lib/faraday/request/url_encoded.rb +5 -1
- data/lib/faraday/request.rb +12 -30
- data/lib/faraday/response/json.rb +54 -0
- data/lib/faraday/response/logger.rb +4 -4
- data/lib/faraday/response/raise_error.rb +9 -1
- data/lib/faraday/response.rb +8 -19
- 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 +10 -44
- data/spec/faraday/adapter/test_spec.rb +36 -0
- data/spec/faraday/connection_spec.rb +148 -91
- data/spec/faraday/middleware_registry_spec.rb +31 -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/json_spec.rb +111 -0
- 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 +117 -0
- data/spec/faraday/response/raise_error_spec.rb +7 -4
- data/spec/faraday/utils/headers_spec.rb +2 -2
- 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 +18 -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
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)
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Faraday
|
6
|
+
class Request
|
7
|
+
# Request middleware that encodes the body as JSON.
|
8
|
+
#
|
9
|
+
# Processes only requests with matching Content-type or those without a type.
|
10
|
+
# If a request doesn't have a type but has a body, it sets the Content-type
|
11
|
+
# to JSON MIME-type.
|
12
|
+
#
|
13
|
+
# Doesn't try to encode bodies that already are in string form.
|
14
|
+
class Json < Middleware
|
15
|
+
MIME_TYPE = 'application/json'
|
16
|
+
MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}.freeze
|
17
|
+
|
18
|
+
def on_request(env)
|
19
|
+
match_content_type(env) do |data|
|
20
|
+
env[:body] = encode(data)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def encode(data)
|
27
|
+
::JSON.generate(data)
|
28
|
+
end
|
29
|
+
|
30
|
+
def match_content_type(env)
|
31
|
+
return unless process_request?(env)
|
32
|
+
|
33
|
+
env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
|
34
|
+
yield env[:body] unless env[:body].respond_to?(:to_str)
|
35
|
+
end
|
36
|
+
|
37
|
+
def process_request?(env)
|
38
|
+
type = request_type(env)
|
39
|
+
body?(env) && (type.empty? || type.match?(MIME_TYPE_REGEX))
|
40
|
+
end
|
41
|
+
|
42
|
+
def body?(env)
|
43
|
+
(body = env[:body]) && !(body.respond_to?(:to_str) && body.empty?)
|
44
|
+
end
|
45
|
+
|
46
|
+
def request_type(env)
|
47
|
+
type = env[:request_headers][CONTENT_TYPE].to_s
|
48
|
+
type = type.split(';', 2).first if type.index(';')
|
49
|
+
type
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
Faraday::Request.register_middleware(json: Faraday::Request::Json)
|
@@ -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,31 +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
|
-
|
49
34
|
# @param request_method [String]
|
50
35
|
# @yield [request] for block customization, if block given
|
51
36
|
# @yieldparam request [Request]
|
@@ -56,14 +41,6 @@ module Faraday
|
|
56
41
|
end
|
57
42
|
end
|
58
43
|
|
59
|
-
def method
|
60
|
-
warn <<~TEXT
|
61
|
-
WARNING: `Faraday::Request##{__method__}` is deprecated; use `#http_method` instead. It will be removed in or after version 2.0.
|
62
|
-
`Faraday::Request##{__method__}` called from #{caller_locations(1..1).first}
|
63
|
-
TEXT
|
64
|
-
http_method
|
65
|
-
end
|
66
|
-
|
67
44
|
# Replace params, preserving the existing hash type.
|
68
45
|
#
|
69
46
|
# @param hash [Hash] new params
|
@@ -138,11 +115,11 @@ module Faraday
|
|
138
115
|
# @param serialised [Hash] the serialised object.
|
139
116
|
def marshal_load(serialised)
|
140
117
|
self.http_method = serialised[:http_method]
|
141
|
-
self.body
|
142
|
-
self.headers
|
143
|
-
self.path
|
144
|
-
self.params
|
145
|
-
self.options
|
118
|
+
self.body = serialised[:body]
|
119
|
+
self.headers = serialised[:headers]
|
120
|
+
self.path = serialised[:path]
|
121
|
+
self.params = serialised[:params]
|
122
|
+
self.options = serialised[:options]
|
146
123
|
end
|
147
124
|
|
148
125
|
# @return [Env] the Env for this Request
|
@@ -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'
|
@@ -0,0 +1,54 @@
|
|
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
|
+
end
|
15
|
+
|
16
|
+
def on_complete(env)
|
17
|
+
process_response(env) if parse_response?(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def process_response(env)
|
23
|
+
env[:raw_body] = env[:body] if @preserve_raw
|
24
|
+
env[:body] = parse(env[:body])
|
25
|
+
rescue StandardError, SyntaxError => e
|
26
|
+
raise Faraday::ParsingError.new(e, env[:response])
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse(body)
|
30
|
+
::JSON.parse(body, @parser_options || {}) unless body.strip.empty?
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_response?(env)
|
34
|
+
process_response_type?(env) &&
|
35
|
+
env[:body].respond_to?(:to_str)
|
36
|
+
end
|
37
|
+
|
38
|
+
def process_response_type?(env)
|
39
|
+
type = response_type(env)
|
40
|
+
@content_types.empty? || @content_types.any? do |pattern|
|
41
|
+
pattern.is_a?(Regexp) ? type.match?(pattern) : type == pattern
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def response_type(env)
|
46
|
+
type = env[:response_headers][CONTENT_TYPE].to_s
|
47
|
+
type = type.split(';', 2).first if type.index(';')
|
48
|
+
type
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
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
|
@@ -11,10 +12,7 @@ module Faraday
|
|
11
12
|
class Logger < Middleware
|
12
13
|
def initialize(app, logger = nil, options = {})
|
13
14
|
super(app)
|
14
|
-
logger ||=
|
15
|
-
require 'logger'
|
16
|
-
::Logger.new($stdout)
|
17
|
-
end
|
15
|
+
logger ||= ::Logger.new($stdout)
|
18
16
|
formatter_class = options.delete(:formatter) || Logging::Formatter
|
19
17
|
@formatter = formatter_class.new(logger: logger, options: options)
|
20
18
|
yield @formatter if block_given?
|
@@ -31,3 +29,5 @@ module Faraday
|
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
32
|
+
|
33
|
+
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,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
|
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
|
@@ -99,3 +84,7 @@ module Faraday
|
|
99
84
|
end
|
100
85
|
end
|
101
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,27 +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/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
20
|
require 'faraday/net_http'
|
43
|
-
require 'faraday/net_http_persistent'
|
44
|
-
require 'faraday/patron'
|
45
|
-
require 'faraday/rack'
|
46
|
-
|
47
21
|
# This is the main namespace for Faraday.
|
48
22
|
#
|
49
23
|
# It provides methods to create {Connection} objects, and HTTP-related
|
@@ -57,6 +31,8 @@ require 'faraday/rack'
|
|
57
31
|
# conn.get '/'
|
58
32
|
#
|
59
33
|
module Faraday
|
34
|
+
CONTENT_TYPE = 'Content-Type'
|
35
|
+
|
60
36
|
class << self
|
61
37
|
# The root path that Faraday is being loaded from.
|
62
38
|
#
|
@@ -78,6 +54,10 @@ module Faraday
|
|
78
54
|
# @return [Symbol] the new default_adapter.
|
79
55
|
attr_reader :default_adapter
|
80
56
|
|
57
|
+
# Option for the default_adapter
|
58
|
+
# @return [Hash] default_adapter options
|
59
|
+
attr_accessor :default_adapter_options
|
60
|
+
|
81
61
|
# Documented below, see default_connection
|
82
62
|
attr_writer :default_connection
|
83
63
|
|
@@ -114,23 +94,10 @@ module Faraday
|
|
114
94
|
# params: { page: 1 }
|
115
95
|
# # => Faraday::Connection to http://faraday.com?page=1
|
116
96
|
def new(url = nil, options = {}, &block)
|
117
|
-
options =
|
97
|
+
options = Utils.deep_merge(default_connection_options, options)
|
118
98
|
Faraday::Connection.new(url, options, &block)
|
119
99
|
end
|
120
100
|
|
121
|
-
# @private
|
122
|
-
# Internal: Requires internal Faraday libraries.
|
123
|
-
#
|
124
|
-
# @param libs [Array] one or more relative String names to Faraday classes.
|
125
|
-
# @return [void]
|
126
|
-
def require_libs(*libs)
|
127
|
-
libs.each do |lib|
|
128
|
-
require "#{lib_path}/#{lib}"
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
alias require_lib require_libs
|
133
|
-
|
134
101
|
# Documented elsewhere, see default_adapter reader
|
135
102
|
def default_adapter=(adapter)
|
136
103
|
@default_connection = nil
|
@@ -186,6 +153,5 @@ module Faraday
|
|
186
153
|
self.root_path = File.expand_path __dir__
|
187
154
|
self.lib_path = File.expand_path 'faraday', __dir__
|
188
155
|
self.default_adapter = :net_http
|
189
|
-
|
190
|
-
require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
|
156
|
+
self.default_adapter_options = {}
|
191
157
|
end
|