faraday 0.13.0 → 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 +5 -5
- data/CHANGELOG.md +496 -0
- data/LICENSE.md +1 -1
- data/README.md +28 -328
- data/Rakefile +7 -0
- data/examples/client_spec.rb +97 -0
- data/examples/client_test.rb +118 -0
- data/lib/faraday/adapter/test.rb +127 -68
- data/lib/faraday/adapter.rb +71 -22
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/connection.rb +314 -226
- data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
- data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
- data/lib/faraday/error.rb +121 -37
- data/lib/faraday/logging/formatter.rb +106 -0
- data/lib/faraday/methods.rb +6 -0
- data/lib/faraday/middleware.rb +18 -25
- data/lib/faraday/middleware_registry.rb +65 -0
- data/lib/faraday/options/connection_options.rb +22 -0
- data/lib/faraday/options/env.rb +181 -0
- data/lib/faraday/options/proxy_options.rb +32 -0
- data/lib/faraday/options/request_options.rb +22 -0
- data/lib/faraday/options/ssl_options.rb +59 -0
- data/lib/faraday/options.rb +41 -195
- data/lib/faraday/parameters.rb +4 -196
- data/lib/faraday/rack_builder.rb +91 -74
- data/lib/faraday/request/authorization.rb +37 -29
- data/lib/faraday/request/instrumentation.rb +47 -27
- data/lib/faraday/request/json.rb +55 -0
- data/lib/faraday/request/url_encoded.rb +45 -23
- data/lib/faraday/request.rb +74 -32
- data/lib/faraday/response/json.rb +54 -0
- data/lib/faraday/response/logger.rb +22 -69
- data/lib/faraday/response/raise_error.rb +57 -14
- data/lib/faraday/response.rb +26 -33
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +47 -251
- data/lib/faraday/version.rb +5 -0
- data/lib/faraday.rb +104 -197
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/spec/faraday/adapter/test_spec.rb +377 -0
- data/spec/faraday/adapter_registry_spec.rb +28 -0
- data/spec/faraday/adapter_spec.rb +55 -0
- data/spec/faraday/connection_spec.rb +787 -0
- data/spec/faraday/error_spec.rb +60 -0
- data/spec/faraday/middleware_spec.rb +52 -0
- data/spec/faraday/options/env_spec.rb +70 -0
- data/spec/faraday/options/options_spec.rb +297 -0
- data/spec/faraday/options/proxy_options_spec.rb +44 -0
- data/spec/faraday/options/request_options_spec.rb +19 -0
- data/spec/faraday/params_encoders/flat_spec.rb +42 -0
- data/spec/faraday/params_encoders/nested_spec.rb +142 -0
- data/spec/faraday/rack_builder_spec.rb +302 -0
- data/spec/faraday/request/authorization_spec.rb +83 -0
- data/spec/faraday/request/instrumentation_spec.rb +74 -0
- data/spec/faraday/request/json_spec.rb +111 -0
- data/spec/faraday/request/url_encoded_spec.rb +82 -0
- data/spec/faraday/request_spec.rb +109 -0
- data/spec/faraday/response/json_spec.rb +117 -0
- data/spec/faraday/response/logger_spec.rb +220 -0
- data/spec/faraday/response/raise_error_spec.rb +172 -0
- data/spec/faraday/response_spec.rb +75 -0
- data/spec/faraday/utils/headers_spec.rb +82 -0
- data/spec/faraday/utils_spec.rb +117 -0
- data/spec/faraday_spec.rb +37 -0
- data/spec/spec_helper.rb +132 -0
- data/spec/support/disabling_stub.rb +14 -0
- data/spec/support/fake_safe_buffer.rb +15 -0
- data/spec/support/helper_methods.rb +96 -0
- data/spec/support/shared_examples/adapter.rb +104 -0
- data/spec/support/shared_examples/params_encoder.rb +18 -0
- data/spec/support/shared_examples/request_method.rb +249 -0
- data/spec/support/streaming_response_checker.rb +35 -0
- metadata +71 -34
- data/lib/faraday/adapter/em_http.rb +0 -243
- data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
- data/lib/faraday/adapter/em_synchrony.rb +0 -106
- data/lib/faraday/adapter/excon.rb +0 -80
- data/lib/faraday/adapter/httpclient.rb +0 -128
- data/lib/faraday/adapter/net_http.rb +0 -135
- data/lib/faraday/adapter/net_http_persistent.rb +0 -54
- data/lib/faraday/adapter/patron.rb +0 -83
- data/lib/faraday/adapter/rack.rb +0 -58
- data/lib/faraday/adapter/typhoeus.rb +0 -123
- data/lib/faraday/autoload.rb +0 -84
- data/lib/faraday/request/basic_authentication.rb +0 -13
- data/lib/faraday/request/multipart.rb +0 -68
- data/lib/faraday/request/retry.rb +0 -164
- data/lib/faraday/request/token_authentication.rb +0 -15
- data/lib/faraday/upload_io.rb +0 -67
data/lib/faraday/parameters.rb
CHANGED
@@ -1,197 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
extend Forwardable
|
7
|
-
def_delegators :'Faraday::Utils', :escape, :unescape
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.encode(params)
|
11
|
-
return nil if params == nil
|
12
|
-
|
13
|
-
if !params.is_a?(Array)
|
14
|
-
if !params.respond_to?(:to_hash)
|
15
|
-
raise TypeError,
|
16
|
-
"Can't convert #{params.class} into Hash."
|
17
|
-
end
|
18
|
-
params = params.to_hash
|
19
|
-
params = params.map do |key, value|
|
20
|
-
key = key.to_s if key.kind_of?(Symbol)
|
21
|
-
[key, value]
|
22
|
-
end
|
23
|
-
# Useful default for OAuth and caching.
|
24
|
-
# Only to be used for non-Array inputs. Arrays should preserve order.
|
25
|
-
params.sort!
|
26
|
-
end
|
27
|
-
|
28
|
-
# Helper lambda
|
29
|
-
to_query = lambda do |parent, value|
|
30
|
-
if value.is_a?(Hash)
|
31
|
-
value = value.map do |key, val|
|
32
|
-
key = escape(key)
|
33
|
-
[key, val]
|
34
|
-
end
|
35
|
-
value.sort!
|
36
|
-
buffer = ""
|
37
|
-
value.each do |key, val|
|
38
|
-
new_parent = "#{parent}%5B#{key}%5D"
|
39
|
-
buffer << "#{to_query.call(new_parent, val)}&"
|
40
|
-
end
|
41
|
-
return buffer.chop
|
42
|
-
elsif value.is_a?(Array)
|
43
|
-
buffer = ""
|
44
|
-
value.each_with_index do |val, i|
|
45
|
-
new_parent = "#{parent}%5B%5D"
|
46
|
-
buffer << "#{to_query.call(new_parent, val)}&"
|
47
|
-
end
|
48
|
-
return buffer.chop
|
49
|
-
elsif value.nil?
|
50
|
-
return parent
|
51
|
-
else
|
52
|
-
encoded_value = escape(value)
|
53
|
-
return "#{parent}=#{encoded_value}"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# The params have form [['key1', 'value1'], ['key2', 'value2']].
|
58
|
-
buffer = ''
|
59
|
-
params.each do |parent, value|
|
60
|
-
encoded_parent = escape(parent)
|
61
|
-
buffer << "#{to_query.call(encoded_parent, value)}&"
|
62
|
-
end
|
63
|
-
return buffer.chop
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.decode(query)
|
67
|
-
return nil if query == nil
|
68
|
-
|
69
|
-
params = {}
|
70
|
-
query.split("&").each do |pair|
|
71
|
-
next if pair.empty?
|
72
|
-
key, value = pair.split("=", 2)
|
73
|
-
key = unescape(key)
|
74
|
-
value = unescape(value.gsub(/\+/, ' ')) if value
|
75
|
-
|
76
|
-
subkeys = key.scan(/[^\[\]]+(?:\]?\[\])?/)
|
77
|
-
context = params
|
78
|
-
subkeys.each_with_index do |subkey, i|
|
79
|
-
is_array = subkey =~ /[\[\]]+\Z/
|
80
|
-
subkey = $` if is_array
|
81
|
-
last_subkey = i == subkeys.length - 1
|
82
|
-
|
83
|
-
if !last_subkey || is_array
|
84
|
-
value_type = is_array ? Array : Hash
|
85
|
-
if context[subkey] && !context[subkey].is_a?(value_type)
|
86
|
-
raise TypeError, "expected %s (got %s) for param `%s'" % [
|
87
|
-
value_type.name,
|
88
|
-
context[subkey].class.name,
|
89
|
-
subkey
|
90
|
-
]
|
91
|
-
end
|
92
|
-
context = (context[subkey] ||= value_type.new)
|
93
|
-
end
|
94
|
-
|
95
|
-
if context.is_a?(Array) && !is_array
|
96
|
-
if !context.last.is_a?(Hash) || context.last.has_key?(subkey)
|
97
|
-
context << {}
|
98
|
-
end
|
99
|
-
context = context.last
|
100
|
-
end
|
101
|
-
|
102
|
-
if last_subkey
|
103
|
-
if is_array
|
104
|
-
context << value
|
105
|
-
else
|
106
|
-
context[subkey] = value
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
dehash(params, 0)
|
113
|
-
end
|
114
|
-
|
115
|
-
# Internal: convert a nested hash with purely numeric keys into an array.
|
116
|
-
# FIXME: this is not compatible with Rack::Utils.parse_nested_query
|
117
|
-
def self.dehash(hash, depth)
|
118
|
-
hash.each do |key, value|
|
119
|
-
hash[key] = dehash(value, depth + 1) if value.kind_of?(Hash)
|
120
|
-
end
|
121
|
-
|
122
|
-
if depth > 0 && !hash.empty? && hash.keys.all? { |k| k =~ /^\d+$/ }
|
123
|
-
hash.keys.sort.inject([]) { |all, key| all << hash[key] }
|
124
|
-
else
|
125
|
-
hash
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
module FlatParamsEncoder
|
131
|
-
class << self
|
132
|
-
extend Forwardable
|
133
|
-
def_delegators :'Faraday::Utils', :escape, :unescape
|
134
|
-
end
|
135
|
-
|
136
|
-
def self.encode(params)
|
137
|
-
return nil if params == nil
|
138
|
-
|
139
|
-
if !params.is_a?(Array)
|
140
|
-
if !params.respond_to?(:to_hash)
|
141
|
-
raise TypeError,
|
142
|
-
"Can't convert #{params.class} into Hash."
|
143
|
-
end
|
144
|
-
params = params.to_hash
|
145
|
-
params = params.map do |key, value|
|
146
|
-
key = key.to_s if key.kind_of?(Symbol)
|
147
|
-
[key, value]
|
148
|
-
end
|
149
|
-
# Useful default for OAuth and caching.
|
150
|
-
# Only to be used for non-Array inputs. Arrays should preserve order.
|
151
|
-
params.sort!
|
152
|
-
end
|
153
|
-
|
154
|
-
# The params have form [['key1', 'value1'], ['key2', 'value2']].
|
155
|
-
buffer = ''
|
156
|
-
params.each do |key, value|
|
157
|
-
encoded_key = escape(key)
|
158
|
-
value = value.to_s if value == true || value == false
|
159
|
-
if value == nil
|
160
|
-
buffer << "#{encoded_key}&"
|
161
|
-
elsif value.kind_of?(Array)
|
162
|
-
value.each do |sub_value|
|
163
|
-
encoded_value = escape(sub_value)
|
164
|
-
buffer << "#{encoded_key}=#{encoded_value}&"
|
165
|
-
end
|
166
|
-
else
|
167
|
-
encoded_value = escape(value)
|
168
|
-
buffer << "#{encoded_key}=#{encoded_value}&"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
return buffer.chop
|
172
|
-
end
|
173
|
-
|
174
|
-
def self.decode(query)
|
175
|
-
empty_accumulator = {}
|
176
|
-
return nil if query == nil
|
177
|
-
split_query = (query.split('&').map do |pair|
|
178
|
-
pair.split('=', 2) if pair && !pair.empty?
|
179
|
-
end).compact
|
180
|
-
return split_query.inject(empty_accumulator.dup) do |accu, pair|
|
181
|
-
pair[0] = unescape(pair[0])
|
182
|
-
pair[1] = true if pair[1].nil?
|
183
|
-
if pair[1].respond_to?(:to_str)
|
184
|
-
pair[1] = unescape(pair[1].to_str.gsub(/\+/, " "))
|
185
|
-
end
|
186
|
-
if accu[pair[0]].kind_of?(Array)
|
187
|
-
accu[pair[0]] << pair[1]
|
188
|
-
elsif accu[pair[0]]
|
189
|
-
accu[pair[0]] = [accu[pair[0]], pair[1]]
|
190
|
-
else
|
191
|
-
accu[pair[0]] = pair[1]
|
192
|
-
end
|
193
|
-
accu
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
3
|
+
require 'forwardable'
|
4
|
+
require 'faraday/encoders/nested_params_encoder'
|
5
|
+
require 'faraday/encoders/flat_params_encoder'
|
data/lib/faraday/rack_builder.rb
CHANGED
@@ -1,12 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ruby2_keywords'
|
4
|
+
require 'faraday/adapter_registry'
|
5
|
+
|
1
6
|
module Faraday
|
2
7
|
# A Builder that processes requests into responses by passing through an inner
|
3
8
|
# middleware stack (heavily inspired by Rack).
|
4
9
|
#
|
5
|
-
#
|
10
|
+
# @example
|
11
|
+
# Faraday::Connection.new(url: 'http://sushi.com') do |builder|
|
6
12
|
# builder.request :url_encoded # Faraday::Request::UrlEncoded
|
7
13
|
# builder.adapter :net_http # Faraday::Adapter::NetHttp
|
8
14
|
# end
|
9
15
|
class RackBuilder
|
16
|
+
# Used to detect missing arguments
|
17
|
+
NO_ARGUMENT = Object.new
|
18
|
+
|
10
19
|
attr_accessor :handlers
|
11
20
|
|
12
21
|
# Error raised when trying to modify the stack after calling `lock!`
|
@@ -15,28 +24,28 @@ module Faraday
|
|
15
24
|
# borrowed from ActiveSupport::Dependencies::Reference &
|
16
25
|
# ActionDispatch::MiddlewareStack::Middleware
|
17
26
|
class Handler
|
18
|
-
|
19
|
-
@@constants = Hash.new { |h, k|
|
20
|
-
value = k.respond_to?(:constantize) ? k.constantize : Object.const_get(k)
|
21
|
-
@@constants_mutex.synchronize { h[k] = value }
|
22
|
-
}
|
27
|
+
REGISTRY = Faraday::AdapterRegistry.new
|
23
28
|
|
24
29
|
attr_reader :name
|
25
30
|
|
26
|
-
def initialize(klass, *args, &block)
|
31
|
+
ruby2_keywords def initialize(klass, *args, &block)
|
27
32
|
@name = klass.to_s
|
28
|
-
if klass.respond_to?(:name)
|
29
|
-
|
30
|
-
|
31
|
-
@args, @block = args, block
|
33
|
+
REGISTRY.set(klass) if klass.respond_to?(:name)
|
34
|
+
@args = args
|
35
|
+
@block = block
|
32
36
|
end
|
33
37
|
|
34
|
-
def klass
|
35
|
-
|
38
|
+
def klass
|
39
|
+
REGISTRY.get(@name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def inspect
|
43
|
+
@name
|
44
|
+
end
|
36
45
|
|
37
46
|
def ==(other)
|
38
47
|
if other.is_a? Handler
|
39
|
-
|
48
|
+
name == other.name
|
40
49
|
elsif other.respond_to? :name
|
41
50
|
klass == other
|
42
51
|
else
|
@@ -44,33 +53,34 @@ module Faraday
|
|
44
53
|
end
|
45
54
|
end
|
46
55
|
|
47
|
-
def build(app)
|
56
|
+
def build(app = nil)
|
48
57
|
klass.new(app, *@args, &@block)
|
49
58
|
end
|
50
59
|
end
|
51
60
|
|
52
|
-
def initialize(
|
53
|
-
@
|
54
|
-
|
55
|
-
|
56
|
-
elsif @handlers.empty?
|
57
|
-
# default stack, if nothing else is configured
|
58
|
-
self.request :url_encoded
|
59
|
-
self.adapter Faraday.default_adapter
|
60
|
-
end
|
61
|
+
def initialize(&block)
|
62
|
+
@adapter = nil
|
63
|
+
@handlers = []
|
64
|
+
build(&block)
|
61
65
|
end
|
62
66
|
|
63
|
-
def
|
67
|
+
def initialize_dup(original)
|
68
|
+
super
|
69
|
+
@adapter = original.adapter
|
70
|
+
@handlers = original.handlers.dup
|
71
|
+
end
|
72
|
+
|
73
|
+
def build
|
64
74
|
raise_if_locked
|
65
|
-
|
66
|
-
|
75
|
+
block_given? ? yield(self) : request(:url_encoded)
|
76
|
+
adapter(Faraday.default_adapter) unless @adapter
|
67
77
|
end
|
68
78
|
|
69
79
|
def [](idx)
|
70
80
|
@handlers[idx]
|
71
81
|
end
|
72
82
|
|
73
|
-
# Locks the middleware stack to ensure no further modifications are
|
83
|
+
# Locks the middleware stack to ensure no further modifications are made.
|
74
84
|
def lock!
|
75
85
|
@handlers.freeze
|
76
86
|
end
|
@@ -79,46 +89,48 @@ module Faraday
|
|
79
89
|
@handlers.frozen?
|
80
90
|
end
|
81
91
|
|
82
|
-
def use(klass, *args, &block)
|
92
|
+
ruby2_keywords def use(klass, *args, &block)
|
83
93
|
if klass.is_a? Symbol
|
84
94
|
use_symbol(Faraday::Middleware, klass, *args, &block)
|
85
95
|
else
|
86
96
|
raise_if_locked
|
87
|
-
|
97
|
+
raise_if_adapter(klass)
|
88
98
|
@handlers << self.class::Handler.new(klass, *args, &block)
|
89
99
|
end
|
90
100
|
end
|
91
101
|
|
92
|
-
def request(key, *args, &block)
|
102
|
+
ruby2_keywords def request(key, *args, &block)
|
93
103
|
use_symbol(Faraday::Request, key, *args, &block)
|
94
104
|
end
|
95
105
|
|
96
|
-
def response(key, *args, &block)
|
106
|
+
ruby2_keywords def response(key, *args, &block)
|
97
107
|
use_symbol(Faraday::Response, key, *args, &block)
|
98
108
|
end
|
99
109
|
|
100
|
-
def adapter(
|
101
|
-
|
110
|
+
ruby2_keywords def adapter(klass = NO_ARGUMENT, *args, &block)
|
111
|
+
return @adapter if klass == NO_ARGUMENT || klass.nil?
|
112
|
+
|
113
|
+
klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
|
114
|
+
@adapter = self.class::Handler.new(klass, *args, &block)
|
102
115
|
end
|
103
116
|
|
104
117
|
## methods to push onto the various positions in the stack:
|
105
118
|
|
106
|
-
def insert(index, *args, &block)
|
119
|
+
ruby2_keywords def insert(index, *args, &block)
|
107
120
|
raise_if_locked
|
108
121
|
index = assert_index(index)
|
109
|
-
warn_middleware_after_adapter if inserting_after_adapter?(index)
|
110
122
|
handler = self.class::Handler.new(*args, &block)
|
111
123
|
@handlers.insert(index, handler)
|
112
124
|
end
|
113
125
|
|
114
|
-
|
126
|
+
alias insert_before insert
|
115
127
|
|
116
|
-
def insert_after(index, *args, &block)
|
128
|
+
ruby2_keywords def insert_after(index, *args, &block)
|
117
129
|
index = assert_index(index)
|
118
130
|
insert(index + 1, *args, &block)
|
119
131
|
end
|
120
132
|
|
121
|
-
def swap(index, *args, &block)
|
133
|
+
ruby2_keywords def swap(index, *args, &block)
|
122
134
|
raise_if_locked
|
123
135
|
index = assert_index(index)
|
124
136
|
@handlers.delete_at(index)
|
@@ -133,10 +145,10 @@ module Faraday
|
|
133
145
|
# Processes a Request into a Response by passing it through this Builder's
|
134
146
|
# middleware stack.
|
135
147
|
#
|
136
|
-
# connection
|
137
|
-
# request
|
148
|
+
# @param connection [Faraday::Connection]
|
149
|
+
# @param request [Faraday::Request]
|
138
150
|
#
|
139
|
-
#
|
151
|
+
# @return [Faraday::Response]
|
140
152
|
def build_response(connection, request)
|
141
153
|
app.call(build_env(connection, request))
|
142
154
|
end
|
@@ -151,30 +163,27 @@ module Faraday
|
|
151
163
|
def app
|
152
164
|
@app ||= begin
|
153
165
|
lock!
|
154
|
-
|
155
|
-
|
156
|
-
env.response = response
|
157
|
-
response.finish(env) unless env.parallel?
|
158
|
-
response
|
159
|
-
})
|
166
|
+
ensure_adapter!
|
167
|
+
to_app
|
160
168
|
end
|
161
169
|
end
|
162
170
|
|
163
|
-
def to_app
|
171
|
+
def to_app
|
164
172
|
# last added handler is the deepest and thus closest to the inner app
|
165
|
-
|
173
|
+
# adapter is always the last one
|
174
|
+
@handlers.reverse.inject(@adapter.build) do |app, handler|
|
175
|
+
handler.build(app)
|
176
|
+
end
|
166
177
|
end
|
167
178
|
|
168
179
|
def ==(other)
|
169
|
-
other.is_a?(self.class) &&
|
170
|
-
|
171
|
-
|
172
|
-
def dup
|
173
|
-
self.class.new(@handlers.dup)
|
180
|
+
other.is_a?(self.class) &&
|
181
|
+
@handlers == other.handlers &&
|
182
|
+
@adapter == other.adapter
|
174
183
|
end
|
175
184
|
|
176
185
|
# ENV Keys
|
177
|
-
# :
|
186
|
+
# :http_method - a symbolized request HTTP method (:get, :post)
|
178
187
|
# :body - the request body that will eventually be converted to a string.
|
179
188
|
# :url - URI instance for the current request.
|
180
189
|
# :status - HTTP response status code
|
@@ -190,45 +199,53 @@ module Faraday
|
|
190
199
|
# :password - Proxy server password
|
191
200
|
# :ssl - Hash of options for configuring SSL requests.
|
192
201
|
def build_env(connection, request)
|
193
|
-
|
194
|
-
|
195
|
-
request.options
|
196
|
-
|
202
|
+
exclusive_url = connection.build_exclusive_url(
|
203
|
+
request.path, request.params,
|
204
|
+
request.options.params_encoder
|
205
|
+
)
|
206
|
+
|
207
|
+
Env.new(request.http_method, request.body, exclusive_url,
|
208
|
+
request.options, request.headers, connection.ssl,
|
209
|
+
connection.parallel_manager)
|
197
210
|
end
|
198
211
|
|
199
212
|
private
|
200
213
|
|
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/.'
|
218
|
+
|
201
219
|
def raise_if_locked
|
202
|
-
raise StackLocked,
|
220
|
+
raise StackLocked, LOCK_ERR if locked?
|
203
221
|
end
|
204
222
|
|
205
|
-
def
|
206
|
-
|
207
|
-
"This won't be supported from Faraday 1.0."
|
208
|
-
end
|
223
|
+
def raise_if_adapter(klass)
|
224
|
+
return unless is_adapter?(klass)
|
209
225
|
|
210
|
-
|
211
|
-
@handlers.any? { |handler| is_adapter?(handler) }
|
226
|
+
raise 'Adapter should be set using the `adapter` method, not `use`'
|
212
227
|
end
|
213
228
|
|
214
|
-
def
|
215
|
-
|
216
|
-
|
229
|
+
def ensure_adapter!
|
230
|
+
raise MISSING_ADAPTER_ERROR unless @adapter
|
231
|
+
end
|
217
232
|
|
218
|
-
|
233
|
+
def adapter_set?
|
234
|
+
!@adapter.nil?
|
219
235
|
end
|
220
236
|
|
221
|
-
def is_adapter?(
|
222
|
-
|
237
|
+
def is_adapter?(klass) # rubocop:disable Naming/PredicateName
|
238
|
+
klass <= Faraday::Adapter
|
223
239
|
end
|
224
240
|
|
225
|
-
def use_symbol(mod, key, *args, &block)
|
241
|
+
ruby2_keywords def use_symbol(mod, key, *args, &block)
|
226
242
|
use(mod.lookup_middleware(key), *args, &block)
|
227
243
|
end
|
228
244
|
|
229
245
|
def assert_index(index)
|
230
246
|
idx = index.is_a?(Integer) ? index : @handlers.index(index)
|
231
247
|
raise "No such handler: #{index.inspect}" unless idx
|
248
|
+
|
232
249
|
idx
|
233
250
|
end
|
234
251
|
end
|
@@ -1,41 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Faraday
|
2
|
-
class Request
|
3
|
-
|
4
|
+
class Request
|
5
|
+
# Request middleware for the Authorization HTTP header
|
6
|
+
class Authorization < Faraday::Middleware
|
7
|
+
KEY = 'Authorization'
|
4
8
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
# @param app [#call]
|
10
|
+
# @param type [String, Symbol] Type of Authorization
|
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)
|
17
|
+
@type = type
|
18
|
+
@params = params
|
19
|
+
super(app)
|
14
20
|
end
|
15
|
-
end
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
values << "#{key}=#{value.to_s.inspect}"
|
22
|
+
# @param env [Faraday::Env]
|
23
|
+
def on_request(env)
|
24
|
+
return if env.request_headers[KEY]
|
25
|
+
|
26
|
+
env.request_headers[KEY] = header_from(@type, *@params)
|
23
27
|
end
|
24
|
-
"#{type} #{values * comma}"
|
25
|
-
end
|
26
28
|
|
27
|
-
|
28
|
-
@header_value = self.class.header(type, token)
|
29
|
-
super(app)
|
30
|
-
end
|
29
|
+
private
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
36
44
|
end
|
37
|
-
@app.call(env)
|
38
45
|
end
|
39
46
|
end
|
40
47
|
end
|
41
48
|
|
49
|
+
Faraday::Request.register_middleware(authorization: Faraday::Request::Authorization)
|
@@ -1,36 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Faraday
|
2
|
-
class Request
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
class Request
|
5
|
+
# Middleware for instrumenting Requests.
|
6
|
+
class Instrumentation < Faraday::Middleware
|
7
|
+
# Options class used in Request::Instrumentation class.
|
8
|
+
class Options < Faraday::Options.new(:name, :instrumenter)
|
9
|
+
# @return [String]
|
10
|
+
def name
|
11
|
+
self[:name] ||= 'request.faraday'
|
12
|
+
end
|
7
13
|
|
8
|
-
|
9
|
-
|
14
|
+
# @return [Class]
|
15
|
+
def instrumenter
|
16
|
+
self[:instrumenter] ||= ActiveSupport::Notifications
|
17
|
+
end
|
10
18
|
end
|
11
|
-
end
|
12
19
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
# Instruments requests using Active Support.
|
21
|
+
#
|
22
|
+
# Measures time spent only for synchronous requests.
|
23
|
+
#
|
24
|
+
# @example Using ActiveSupport::Notifications to measure time spent
|
25
|
+
# for Faraday requests.
|
26
|
+
# ActiveSupport::Notifications
|
27
|
+
# .subscribe('request.faraday') do |name, starts, ends, _, env|
|
28
|
+
# url = env[:url]
|
29
|
+
# http_method = env[:method].to_s.upcase
|
30
|
+
# duration = ends - starts
|
31
|
+
# $stderr.puts '[%s] %s %s (%.3f s)' %
|
32
|
+
# [url.host, http_method, url.request_uri, duration]
|
33
|
+
# end
|
34
|
+
# @param app [#call]
|
35
|
+
# @param options [nil, Hash] Options hash
|
36
|
+
# @option options [String] :name ('request.faraday')
|
37
|
+
# Name of the instrumenter
|
38
|
+
# @option options [Class] :instrumenter (ActiveSupport::Notifications)
|
39
|
+
# Active Support instrumenter class.
|
40
|
+
def initialize(app, options = nil)
|
41
|
+
super(app)
|
42
|
+
@name, @instrumenter = Options.from(options)
|
43
|
+
.values_at(:name, :instrumenter)
|
44
|
+
end
|
29
45
|
|
30
|
-
|
31
|
-
|
32
|
-
@
|
46
|
+
# @param env [Faraday::Env]
|
47
|
+
def call(env)
|
48
|
+
@instrumenter.instrument(@name, env) do
|
49
|
+
@app.call(env)
|
50
|
+
end
|
33
51
|
end
|
34
52
|
end
|
35
53
|
end
|
36
54
|
end
|
55
|
+
|
56
|
+
Faraday::Request.register_middleware(instrumentation: Faraday::Request::Instrumentation)
|