oso-cloud 1.8.0 → 1.9.1.pre.vendored.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/.gitignore +0 -1
- data/Gemfile +5 -0
- data/Gemfile.lock +31 -12
- data/README.md +1 -1
- data/lib/oso/api.rb +18 -2
- data/lib/oso/oso.rb +10 -7
- data/lib/oso/version.rb +1 -1
- data/vendor/gems/faraday-2.5.2/CHANGELOG.md +574 -0
- data/vendor/gems/faraday-2.5.2/LICENSE.md +20 -0
- data/vendor/gems/faraday-2.5.2/README.md +55 -0
- data/vendor/gems/faraday-2.5.2/Rakefile +7 -0
- data/vendor/gems/faraday-2.5.2/examples/client_spec.rb +119 -0
- data/vendor/gems/faraday-2.5.2/examples/client_test.rb +144 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/adapter/test.rb +298 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/adapter.rb +102 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/adapter_registry.rb +30 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/connection.rb +561 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/encoders/flat_params_encoder.rb +105 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/encoders/nested_params_encoder.rb +183 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/error.rb +147 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/logging/formatter.rb +106 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/methods.rb +6 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/middleware.rb +30 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/middleware_registry.rb +83 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/connection_options.rb +22 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/env.rb +199 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/proxy_options.rb +32 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/request_options.rb +22 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options/ssl_options.rb +69 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/options.rb +218 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/parameters.rb +5 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/rack_builder.rb +252 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/authorization.rb +49 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/instrumentation.rb +56 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/json.rb +55 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request/url_encoded.rb +60 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/request.rb +136 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response/json.rb +54 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response/logger.rb +33 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response/raise_error.rb +64 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/response.rb +90 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/utils/headers.rb +139 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/utils/params_hash.rb +61 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/utils.rb +122 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday/version.rb +5 -0
- data/vendor/gems/faraday-2.5.2/lib/faraday.rb +157 -0
- data/vendor/gems/faraday-2.5.2/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/adapter/test_spec.rb +413 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/adapter_registry_spec.rb +28 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/adapter_spec.rb +55 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/connection_spec.rb +793 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/error_spec.rb +60 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/middleware_registry_spec.rb +31 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/middleware_spec.rb +52 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/env_spec.rb +76 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/options_spec.rb +297 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/proxy_options_spec.rb +44 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/options/request_options_spec.rb +19 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/params_encoders/flat_spec.rb +42 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/params_encoders/nested_spec.rb +150 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/rack_builder_spec.rb +317 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/authorization_spec.rb +83 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/instrumentation_spec.rb +74 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/json_spec.rb +111 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request/url_encoded_spec.rb +93 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/request_spec.rb +110 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response/json_spec.rb +117 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response/logger_spec.rb +220 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response/raise_error_spec.rb +172 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/response_spec.rb +75 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/utils/headers_spec.rb +82 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday/utils_spec.rb +118 -0
- data/vendor/gems/faraday-2.5.2/spec/faraday_spec.rb +37 -0
- data/vendor/gems/faraday-2.5.2/spec/spec_helper.rb +132 -0
- data/vendor/gems/faraday-2.5.2/spec/support/disabling_stub.rb +14 -0
- data/vendor/gems/faraday-2.5.2/spec/support/fake_safe_buffer.rb +15 -0
- data/vendor/gems/faraday-2.5.2/spec/support/helper_methods.rb +96 -0
- data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/adapter.rb +105 -0
- data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/params_encoder.rb +18 -0
- data/vendor/gems/faraday-2.5.2/spec/support/shared_examples/request_method.rb +263 -0
- data/vendor/gems/faraday-2.5.2/spec/support/streaming_response_checker.rb +35 -0
- data/vendor/gems/faraday-net_http-3.0.2/LICENSE.md +21 -0
- data/vendor/gems/faraday-net_http-3.0.2/README.md +57 -0
- data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/adapter/net_http.rb +208 -0
- data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/net_http/version.rb +7 -0
- data/vendor/gems/faraday-net_http-3.0.2/lib/faraday/net_http.rb +10 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/LICENSE.md +21 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/README.md +66 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/adapter/net_http_persistent.rb +234 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/net_http_persistent/version.rb +7 -0
- data/vendor/gems/faraday-net_http_persistent-2.3.0/lib/faraday/net_http_persistent.rb +18 -0
- data/vendor/gems/faraday-retry-2.0.0/CHANGELOG.md +24 -0
- data/vendor/gems/faraday-retry-2.0.0/LICENSE.md +21 -0
- data/vendor/gems/faraday-retry-2.0.0/README.md +169 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retriable_response.rb +8 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry/middleware.rb +254 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry/version.rb +7 -0
- data/vendor/gems/faraday-retry-2.0.0/lib/faraday/retry.rb +13 -0
- data/vendor/gems/net-http-persistent-4.0.5/.autotest +9 -0
- data/vendor/gems/net-http-persistent-4.0.5/.gemtest +0 -0
- data/vendor/gems/net-http-persistent-4.0.5/Gemfile +14 -0
- data/vendor/gems/net-http-persistent-4.0.5/History.txt +460 -0
- data/vendor/gems/net-http-persistent-4.0.5/Manifest.txt +13 -0
- data/vendor/gems/net-http-persistent-4.0.5/README.rdoc +82 -0
- data/vendor/gems/net-http-persistent-4.0.5/Rakefile +25 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/connection.rb +41 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/pool.rb +65 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent/timed_stack_multi.rb +79 -0
- data/vendor/gems/net-http-persistent-4.0.5/lib/net/http/persistent.rb +1158 -0
- data/vendor/gems/net-http-persistent-4.0.5/test/test_net_http_persistent.rb +1512 -0
- data/vendor/gems/net-http-persistent-4.0.5/test/test_net_http_persistent_timed_stack_multi.rb +151 -0
- metadata +112 -8
@@ -0,0 +1,183 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# Sub-module for encoding parameters into query-string.
|
5
|
+
module EncodeMethods
|
6
|
+
# @param params [nil, Array, #to_hash] parameters to be encoded
|
7
|
+
#
|
8
|
+
# @return [String] the encoded params
|
9
|
+
#
|
10
|
+
# @raise [TypeError] if params can not be converted to a Hash
|
11
|
+
def encode(params)
|
12
|
+
return nil if params.nil?
|
13
|
+
|
14
|
+
unless params.is_a?(Array)
|
15
|
+
unless params.respond_to?(:to_hash)
|
16
|
+
raise TypeError, "Can't convert #{params.class} into Hash."
|
17
|
+
end
|
18
|
+
|
19
|
+
params = params.to_hash
|
20
|
+
params = params.map do |key, value|
|
21
|
+
key = key.to_s if key.is_a?(Symbol)
|
22
|
+
[key, value]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Only to be used for non-Array inputs. Arrays should preserve order.
|
26
|
+
params.sort! if @sort_params
|
27
|
+
end
|
28
|
+
|
29
|
+
# The params have form [['key1', 'value1'], ['key2', 'value2']].
|
30
|
+
buffer = +''
|
31
|
+
params.each do |parent, value|
|
32
|
+
encoded_parent = escape(parent)
|
33
|
+
buffer << "#{encode_pair(encoded_parent, value)}&"
|
34
|
+
end
|
35
|
+
buffer.chop
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def encode_pair(parent, value)
|
41
|
+
if value.is_a?(Hash)
|
42
|
+
encode_hash(parent, value)
|
43
|
+
elsif value.is_a?(Array)
|
44
|
+
encode_array(parent, value)
|
45
|
+
elsif value.nil?
|
46
|
+
parent
|
47
|
+
else
|
48
|
+
encoded_value = escape(value)
|
49
|
+
"#{parent}=#{encoded_value}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def encode_hash(parent, value)
|
54
|
+
value = value.map { |key, val| [escape(key), val] }.sort
|
55
|
+
|
56
|
+
buffer = +''
|
57
|
+
value.each do |key, val|
|
58
|
+
new_parent = "#{parent}%5B#{key}%5D"
|
59
|
+
buffer << "#{encode_pair(new_parent, val)}&"
|
60
|
+
end
|
61
|
+
buffer.chop
|
62
|
+
end
|
63
|
+
|
64
|
+
def encode_array(parent, value)
|
65
|
+
return "#{parent}%5B%5D" if value.empty?
|
66
|
+
|
67
|
+
buffer = +''
|
68
|
+
value.each_with_index do |val, index|
|
69
|
+
new_parent = if @array_indices
|
70
|
+
"#{parent}%5B#{index}%5D"
|
71
|
+
else
|
72
|
+
"#{parent}%5B%5D"
|
73
|
+
end
|
74
|
+
buffer << "#{encode_pair(new_parent, val)}&"
|
75
|
+
end
|
76
|
+
buffer.chop
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Sub-module for decoding query-string into parameters.
|
81
|
+
module DecodeMethods
|
82
|
+
# @param query [nil, String]
|
83
|
+
#
|
84
|
+
# @return [Array<Array, String>] the decoded params
|
85
|
+
#
|
86
|
+
# @raise [TypeError] if the nesting is incorrect
|
87
|
+
def decode(query)
|
88
|
+
return nil if query.nil?
|
89
|
+
|
90
|
+
params = {}
|
91
|
+
query.split('&').each do |pair|
|
92
|
+
next if pair.empty?
|
93
|
+
|
94
|
+
key, value = pair.split('=', 2)
|
95
|
+
key = unescape(key)
|
96
|
+
value = unescape(value.tr('+', ' ')) if value
|
97
|
+
decode_pair(key, value, params)
|
98
|
+
end
|
99
|
+
|
100
|
+
dehash(params, 0)
|
101
|
+
end
|
102
|
+
|
103
|
+
protected
|
104
|
+
|
105
|
+
SUBKEYS_REGEX = /[^\[\]]+(?:\]?\[\])?/.freeze
|
106
|
+
|
107
|
+
def decode_pair(key, value, context)
|
108
|
+
subkeys = key.scan(SUBKEYS_REGEX)
|
109
|
+
subkeys.each_with_index do |subkey, i|
|
110
|
+
is_array = subkey =~ /[\[\]]+\Z/
|
111
|
+
subkey = Regexp.last_match.pre_match if is_array
|
112
|
+
last_subkey = i == subkeys.length - 1
|
113
|
+
|
114
|
+
context = prepare_context(context, subkey, is_array, last_subkey)
|
115
|
+
add_to_context(is_array, context, value, subkey) if last_subkey
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def prepare_context(context, subkey, is_array, last_subkey)
|
120
|
+
if !last_subkey || is_array
|
121
|
+
context = new_context(subkey, is_array, context)
|
122
|
+
end
|
123
|
+
if context.is_a?(Array) && !is_array
|
124
|
+
context = match_context(context, subkey)
|
125
|
+
end
|
126
|
+
context
|
127
|
+
end
|
128
|
+
|
129
|
+
def new_context(subkey, is_array, context)
|
130
|
+
value_type = is_array ? Array : Hash
|
131
|
+
if context[subkey] && !context[subkey].is_a?(value_type)
|
132
|
+
raise TypeError, "expected #{value_type.name} " \
|
133
|
+
"(got #{context[subkey].class.name}) for param `#{subkey}'"
|
134
|
+
end
|
135
|
+
|
136
|
+
context[subkey] ||= value_type.new
|
137
|
+
end
|
138
|
+
|
139
|
+
def match_context(context, subkey)
|
140
|
+
context << {} if !context.last.is_a?(Hash) || context.last.key?(subkey)
|
141
|
+
context.last
|
142
|
+
end
|
143
|
+
|
144
|
+
def add_to_context(is_array, context, value, subkey)
|
145
|
+
is_array ? context << value : context[subkey] = value
|
146
|
+
end
|
147
|
+
|
148
|
+
# Internal: convert a nested hash with purely numeric keys into an array.
|
149
|
+
# FIXME: this is not compatible with Rack::Utils.parse_nested_query
|
150
|
+
# @!visibility private
|
151
|
+
def dehash(hash, depth)
|
152
|
+
hash.each do |key, value|
|
153
|
+
hash[key] = dehash(value, depth + 1) if value.is_a?(Hash)
|
154
|
+
end
|
155
|
+
|
156
|
+
if depth.positive? && !hash.empty? && hash.keys.all? { |k| k =~ /^\d+$/ }
|
157
|
+
hash.sort.map(&:last)
|
158
|
+
else
|
159
|
+
hash
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# This is the default encoder for Faraday requests.
|
165
|
+
# Using this encoder, parameters will be encoded respecting their structure,
|
166
|
+
# so you can send objects such as Arrays or Hashes as parameters
|
167
|
+
# for your requests.
|
168
|
+
module NestedParamsEncoder
|
169
|
+
class << self
|
170
|
+
attr_accessor :sort_params, :array_indices
|
171
|
+
|
172
|
+
extend Forwardable
|
173
|
+
def_delegators :'Faraday::Utils', :escape, :unescape
|
174
|
+
end
|
175
|
+
|
176
|
+
# Useful default for OAuth and caching.
|
177
|
+
@sort_params = true
|
178
|
+
@array_indices = false
|
179
|
+
|
180
|
+
extend EncodeMethods
|
181
|
+
extend DecodeMethods
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Faraday namespace.
|
4
|
+
module Faraday
|
5
|
+
# Faraday error base class.
|
6
|
+
class Error < StandardError
|
7
|
+
attr_reader :response, :wrapped_exception
|
8
|
+
|
9
|
+
def initialize(exc = nil, response = nil)
|
10
|
+
@wrapped_exception = nil unless defined?(@wrapped_exception)
|
11
|
+
@response = nil unless defined?(@response)
|
12
|
+
super(exc_msg_and_response!(exc, response))
|
13
|
+
end
|
14
|
+
|
15
|
+
def backtrace
|
16
|
+
if @wrapped_exception
|
17
|
+
@wrapped_exception.backtrace
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def inspect
|
24
|
+
inner = +''
|
25
|
+
inner << " wrapped=#{@wrapped_exception.inspect}" if @wrapped_exception
|
26
|
+
inner << " response=#{@response.inspect}" if @response
|
27
|
+
inner << " #{super}" if inner.empty?
|
28
|
+
%(#<#{self.class}#{inner}>)
|
29
|
+
end
|
30
|
+
|
31
|
+
def response_status
|
32
|
+
@response[:status] if @response
|
33
|
+
end
|
34
|
+
|
35
|
+
def response_headers
|
36
|
+
@response[:headers] if @response
|
37
|
+
end
|
38
|
+
|
39
|
+
def response_body
|
40
|
+
@response[:body] if @response
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
# Pulls out potential parent exception and response hash, storing them in
|
46
|
+
# instance variables.
|
47
|
+
# exc - Either an Exception, a string message, or a response hash.
|
48
|
+
# response - Hash
|
49
|
+
# :status - Optional integer HTTP response status
|
50
|
+
# :headers - String key/value hash of HTTP response header
|
51
|
+
# values.
|
52
|
+
# :body - Optional string HTTP response body.
|
53
|
+
# :request - Hash
|
54
|
+
# :method - Symbol with the request HTTP method.
|
55
|
+
# :url - URI object with the url requested.
|
56
|
+
# :url_path - String with the url path requested.
|
57
|
+
# :params - String key/value hash of query params
|
58
|
+
# present in the request.
|
59
|
+
# :headers - String key/value hash of HTTP request
|
60
|
+
# header values.
|
61
|
+
# :body - String HTTP request body.
|
62
|
+
#
|
63
|
+
# If a subclass has to call this, then it should pass a string message
|
64
|
+
# to `super`. See NilStatusError.
|
65
|
+
def exc_msg_and_response!(exc, response = nil)
|
66
|
+
if @response.nil? && @wrapped_exception.nil?
|
67
|
+
@wrapped_exception, msg, @response = exc_msg_and_response(exc, response)
|
68
|
+
return msg
|
69
|
+
end
|
70
|
+
|
71
|
+
exc.to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
# Pulls out potential parent exception and response hash.
|
75
|
+
def exc_msg_and_response(exc, response = nil)
|
76
|
+
return [exc, exc.message, response] if exc.respond_to?(:backtrace)
|
77
|
+
|
78
|
+
return [nil, "the server responded with status #{exc[:status]}", exc] \
|
79
|
+
if exc.respond_to?(:each_key)
|
80
|
+
|
81
|
+
[nil, exc.to_s, response]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Faraday client error class. Represents 4xx status responses.
|
86
|
+
class ClientError < Error
|
87
|
+
end
|
88
|
+
|
89
|
+
# Raised by Faraday::Response::RaiseError in case of a 400 response.
|
90
|
+
class BadRequestError < ClientError
|
91
|
+
end
|
92
|
+
|
93
|
+
# Raised by Faraday::Response::RaiseError in case of a 401 response.
|
94
|
+
class UnauthorizedError < ClientError
|
95
|
+
end
|
96
|
+
|
97
|
+
# Raised by Faraday::Response::RaiseError in case of a 403 response.
|
98
|
+
class ForbiddenError < ClientError
|
99
|
+
end
|
100
|
+
|
101
|
+
# Raised by Faraday::Response::RaiseError in case of a 404 response.
|
102
|
+
class ResourceNotFound < ClientError
|
103
|
+
end
|
104
|
+
|
105
|
+
# Raised by Faraday::Response::RaiseError in case of a 407 response.
|
106
|
+
class ProxyAuthError < ClientError
|
107
|
+
end
|
108
|
+
|
109
|
+
# Raised by Faraday::Response::RaiseError in case of a 409 response.
|
110
|
+
class ConflictError < ClientError
|
111
|
+
end
|
112
|
+
|
113
|
+
# Raised by Faraday::Response::RaiseError in case of a 422 response.
|
114
|
+
class UnprocessableEntityError < ClientError
|
115
|
+
end
|
116
|
+
|
117
|
+
# Faraday server error class. Represents 5xx status responses.
|
118
|
+
class ServerError < Error
|
119
|
+
end
|
120
|
+
|
121
|
+
# A unified client error for timeouts.
|
122
|
+
class TimeoutError < ServerError
|
123
|
+
def initialize(exc = 'timeout', response = nil)
|
124
|
+
super(exc, response)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Raised by Faraday::Response::RaiseError in case of a nil status in response.
|
129
|
+
class NilStatusError < ServerError
|
130
|
+
def initialize(exc, response = nil)
|
131
|
+
exc_msg_and_response!(exc, response)
|
132
|
+
super('http status could not be derived from the server response')
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# A unified error for failed connections.
|
137
|
+
class ConnectionFailed < Error
|
138
|
+
end
|
139
|
+
|
140
|
+
# A unified client error for SSL errors.
|
141
|
+
class SSLError < Error
|
142
|
+
end
|
143
|
+
|
144
|
+
# Raised by middlewares that parse the response, like the JSON response middleware.
|
145
|
+
class ParsingError < Error
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
module Faraday
|
6
|
+
module Logging
|
7
|
+
# Serves as an integration point to customize logging
|
8
|
+
class Formatter
|
9
|
+
extend Forwardable
|
10
|
+
|
11
|
+
DEFAULT_OPTIONS = { headers: true, bodies: false,
|
12
|
+
log_level: :info }.freeze
|
13
|
+
|
14
|
+
def initialize(logger:, options:)
|
15
|
+
@logger = logger
|
16
|
+
@filter = []
|
17
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def_delegators :@logger, :debug, :info, :warn, :error, :fatal
|
21
|
+
|
22
|
+
def request(env)
|
23
|
+
request_log = proc do
|
24
|
+
"#{env.method.upcase} #{apply_filters(env.url.to_s)}"
|
25
|
+
end
|
26
|
+
public_send(log_level, 'request', &request_log)
|
27
|
+
|
28
|
+
log_headers('request', env.request_headers) if log_headers?(:request)
|
29
|
+
log_body('request', env[:body]) if env[:body] && log_body?(:request)
|
30
|
+
end
|
31
|
+
|
32
|
+
def response(env)
|
33
|
+
status = proc { "Status #{env.status}" }
|
34
|
+
public_send(log_level, 'response', &status)
|
35
|
+
|
36
|
+
log_headers('response', env.response_headers) if log_headers?(:response)
|
37
|
+
log_body('response', env[:body]) if env[:body] && log_body?(:response)
|
38
|
+
end
|
39
|
+
|
40
|
+
def filter(filter_word, filter_replacement)
|
41
|
+
@filter.push([filter_word, filter_replacement])
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def dump_headers(headers)
|
47
|
+
headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n")
|
48
|
+
end
|
49
|
+
|
50
|
+
def dump_body(body)
|
51
|
+
if body.respond_to?(:to_str)
|
52
|
+
body.to_str
|
53
|
+
else
|
54
|
+
pretty_inspect(body)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def pretty_inspect(body)
|
59
|
+
body.pretty_inspect
|
60
|
+
end
|
61
|
+
|
62
|
+
def log_headers?(type)
|
63
|
+
case @options[:headers]
|
64
|
+
when Hash
|
65
|
+
@options[:headers][type]
|
66
|
+
else
|
67
|
+
@options[:headers]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def log_body?(type)
|
72
|
+
case @options[:bodies]
|
73
|
+
when Hash
|
74
|
+
@options[:bodies][type]
|
75
|
+
else
|
76
|
+
@options[:bodies]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def apply_filters(output)
|
81
|
+
@filter.each do |pattern, replacement|
|
82
|
+
output = output.to_s.gsub(pattern, replacement)
|
83
|
+
end
|
84
|
+
output
|
85
|
+
end
|
86
|
+
|
87
|
+
def log_level
|
88
|
+
unless %i[debug info warn error fatal].include?(@options[:log_level])
|
89
|
+
return :info
|
90
|
+
end
|
91
|
+
|
92
|
+
@options[:log_level]
|
93
|
+
end
|
94
|
+
|
95
|
+
def log_headers(type, headers)
|
96
|
+
headers_log = proc { apply_filters(dump_headers(headers)) }
|
97
|
+
public_send(log_level, type, &headers_log)
|
98
|
+
end
|
99
|
+
|
100
|
+
def log_body(type, body)
|
101
|
+
body_log = proc { apply_filters(dump_body(body)) }
|
102
|
+
public_send(log_level, type, &body_log)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# Middleware is the basic base class of any Faraday middleware.
|
5
|
+
class Middleware
|
6
|
+
extend MiddlewareRegistry
|
7
|
+
|
8
|
+
attr_reader :app, :options
|
9
|
+
|
10
|
+
def initialize(app = nil, options = {})
|
11
|
+
@app = app
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
on_request(env) if respond_to?(:on_request)
|
17
|
+
app.call(env).on_complete do |environment|
|
18
|
+
on_complete(environment) if respond_to?(:on_complete)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def close
|
23
|
+
if app.respond_to?(:close)
|
24
|
+
app.close
|
25
|
+
else
|
26
|
+
warn "#{app} does not implement \#close!"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'monitor'
|
4
|
+
|
5
|
+
module Faraday
|
6
|
+
# Adds the ability for other modules to register and lookup
|
7
|
+
# middleware classes.
|
8
|
+
module MiddlewareRegistry
|
9
|
+
def registered_middleware
|
10
|
+
@registered_middleware ||= {}
|
11
|
+
end
|
12
|
+
|
13
|
+
# Register middleware class(es) on the current module.
|
14
|
+
#
|
15
|
+
# @param mappings [Hash] Middleware mappings from a lookup symbol to a middleware class.
|
16
|
+
# @return [void]
|
17
|
+
#
|
18
|
+
# @example Lookup by a constant
|
19
|
+
#
|
20
|
+
# module Faraday
|
21
|
+
# class Whatever < Middleware
|
22
|
+
# # Middleware looked up by :foo returns Faraday::Whatever::Foo.
|
23
|
+
# register_middleware(foo: Whatever)
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
def register_middleware(**mappings)
|
27
|
+
middleware_mutex do
|
28
|
+
registered_middleware.update(mappings)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Unregister a previously registered middleware class.
|
33
|
+
#
|
34
|
+
# @param key [Symbol] key for the registered middleware.
|
35
|
+
def unregister_middleware(key)
|
36
|
+
registered_middleware.delete(key)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Lookup middleware class with a registered Symbol shortcut.
|
40
|
+
#
|
41
|
+
# @param key [Symbol] key for the registered middleware.
|
42
|
+
# @return [Class] a middleware Class.
|
43
|
+
# @raise [Faraday::Error] if given key is not registered
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
#
|
47
|
+
# module Faraday
|
48
|
+
# class Whatever < Middleware
|
49
|
+
# register_middleware(foo: Whatever)
|
50
|
+
# end
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# Faraday::Middleware.lookup_middleware(:foo)
|
54
|
+
# # => Faraday::Whatever
|
55
|
+
def lookup_middleware(key)
|
56
|
+
load_middleware(key) ||
|
57
|
+
raise(Faraday::Error, "#{key.inspect} is not registered on #{self}")
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def middleware_mutex(&block)
|
63
|
+
@middleware_mutex ||= Monitor.new
|
64
|
+
@middleware_mutex.synchronize(&block)
|
65
|
+
end
|
66
|
+
|
67
|
+
def load_middleware(key)
|
68
|
+
value = registered_middleware[key]
|
69
|
+
case value
|
70
|
+
when Module
|
71
|
+
value
|
72
|
+
when Symbol, String
|
73
|
+
middleware_mutex do
|
74
|
+
@registered_middleware[key] = const_get(value)
|
75
|
+
end
|
76
|
+
when Proc
|
77
|
+
middleware_mutex do
|
78
|
+
@registered_middleware[key] = value.call
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
# ConnectionOptions contains the configurable properties for a Faraday
|
5
|
+
# connection object.
|
6
|
+
class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url,
|
7
|
+
:parallel_manager, :params, :headers,
|
8
|
+
:builder_class)
|
9
|
+
|
10
|
+
options request: RequestOptions, ssl: SSLOptions
|
11
|
+
|
12
|
+
memoized(:request) { self.class.options_for(:request).new }
|
13
|
+
|
14
|
+
memoized(:ssl) { self.class.options_for(:ssl).new }
|
15
|
+
|
16
|
+
memoized(:builder_class) { RackBuilder }
|
17
|
+
|
18
|
+
def new_builder(block)
|
19
|
+
builder_class.new(&block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|