aws-sdk-core 3.197.2 → 3.225.1
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 +355 -0
- data/VERSION +1 -1
- data/lib/aws-defaults/default_configuration.rb +1 -2
- data/lib/aws-defaults.rb +4 -1
- data/lib/aws-sdk-core/arn.rb +1 -3
- data/lib/aws-sdk-core/assume_role_credentials.rb +13 -5
- data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +14 -7
- data/lib/aws-sdk-core/binary/decode_handler.rb +3 -4
- data/lib/aws-sdk-core/binary/encode_handler.rb +1 -1
- data/lib/aws-sdk-core/binary/event_stream_decoder.rb +1 -0
- data/lib/aws-sdk-core/binary/event_stream_encoder.rb +4 -3
- data/lib/aws-sdk-core/cbor/decoder.rb +308 -0
- data/lib/aws-sdk-core/cbor/encoder.rb +243 -0
- data/lib/aws-sdk-core/cbor.rb +53 -0
- data/lib/aws-sdk-core/client_side_monitoring.rb +9 -0
- data/lib/aws-sdk-core/client_stubs.rb +30 -55
- data/lib/aws-sdk-core/credential_provider.rb +4 -0
- data/lib/aws-sdk-core/credential_provider_chain.rb +37 -10
- data/lib/aws-sdk-core/credentials.rb +19 -6
- data/lib/aws-sdk-core/ecs_credentials.rb +1 -0
- data/lib/aws-sdk-core/endpoints/endpoint.rb +3 -1
- data/lib/aws-sdk-core/endpoints/matchers.rb +1 -8
- data/lib/aws-sdk-core/endpoints.rb +74 -18
- data/lib/aws-sdk-core/error_handler.rb +41 -0
- data/lib/aws-sdk-core/errors.rb +11 -2
- data/lib/aws-sdk-core/instance_profile_credentials.rb +1 -0
- data/lib/aws-sdk-core/json/error_handler.rb +8 -9
- data/lib/aws-sdk-core/json/handler.rb +6 -6
- data/lib/aws-sdk-core/json/json_engine.rb +3 -1
- data/lib/aws-sdk-core/json/oj_engine.rb +7 -1
- data/lib/aws-sdk-core/json/parser.rb +2 -0
- data/lib/aws-sdk-core/json.rb +43 -14
- data/lib/aws-sdk-core/log/param_filter.rb +2 -2
- data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
- data/lib/aws-sdk-core/log.rb +10 -0
- data/lib/aws-sdk-core/param_validator.rb +1 -1
- data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
- data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +332 -169
- data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +0 -1
- data/lib/aws-sdk-core/plugins/credentials_configuration.rb +7 -3
- data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
- data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
- data/lib/aws-sdk-core/plugins/http_checksum.rb +2 -8
- data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
- data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
- data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
- data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
- data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +4 -3
- data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +5 -1
- data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
- data/lib/aws-sdk-core/plugins/regional_endpoint.rb +74 -25
- data/lib/aws-sdk-core/plugins/retry_errors.rb +0 -1
- data/lib/aws-sdk-core/plugins/sign.rb +28 -12
- data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -1
- data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -1
- data/lib/aws-sdk-core/plugins/stub_responses.rb +52 -9
- data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
- data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
- data/lib/aws-sdk-core/plugins/user_agent.rb +48 -9
- data/lib/aws-sdk-core/plugins.rb +39 -0
- data/lib/aws-sdk-core/process_credentials.rb +3 -2
- data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
- data/lib/aws-sdk-core/query/handler.rb +4 -4
- data/lib/aws-sdk-core/query.rb +2 -1
- data/lib/aws-sdk-core/resources.rb +8 -0
- data/lib/aws-sdk-core/rest/{request/content_type.rb → content_type_handler.rb} +1 -1
- data/lib/aws-sdk-core/rest/handler.rb +3 -4
- data/lib/aws-sdk-core/rest/request/headers.rb +3 -3
- data/lib/aws-sdk-core/rest.rb +1 -1
- data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
- data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
- data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
- data/lib/aws-sdk-core/rpc_v2/error_handler.rb +85 -0
- data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
- data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
- data/lib/aws-sdk-core/rpc_v2.rb +69 -0
- data/lib/aws-sdk-core/shared_config.rb +78 -22
- data/lib/aws-sdk-core/shared_credentials.rb +1 -7
- data/lib/aws-sdk-core/sso_credentials.rb +4 -1
- data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
- data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
- data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
- data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
- data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
- data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
- data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
- data/lib/aws-sdk-core/stubbing.rb +22 -0
- data/lib/aws-sdk-core/telemetry/base.rb +177 -0
- data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
- data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
- data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
- data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
- data/lib/aws-sdk-core/telemetry.rb +78 -0
- data/lib/aws-sdk-core/waiters/poller.rb +9 -4
- data/lib/aws-sdk-core/xml/error_handler.rb +11 -37
- data/lib/aws-sdk-core/xml/parser.rb +2 -6
- data/lib/aws-sdk-core.rb +82 -108
- data/lib/aws-sdk-sso/client.rb +100 -39
- data/lib/aws-sdk-sso/client_api.rb +7 -0
- data/lib/aws-sdk-sso/endpoint_parameters.rb +9 -6
- data/lib/aws-sdk-sso/endpoint_provider.rb +14 -18
- data/lib/aws-sdk-sso/endpoints.rb +2 -54
- data/lib/aws-sdk-sso/plugins/endpoints.rb +19 -20
- data/lib/aws-sdk-sso/types.rb +1 -0
- data/lib/aws-sdk-sso.rb +15 -11
- data/lib/aws-sdk-ssooidc/client.rb +137 -59
- data/lib/aws-sdk-ssooidc/client_api.rb +11 -0
- data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +9 -6
- data/lib/aws-sdk-ssooidc/endpoint_provider.rb +14 -18
- data/lib/aws-sdk-ssooidc/endpoints.rb +2 -54
- data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +19 -20
- data/lib/aws-sdk-ssooidc/types.rb +49 -16
- data/lib/aws-sdk-ssooidc.rb +15 -11
- data/lib/aws-sdk-sts/client.rb +308 -91
- data/lib/aws-sdk-sts/client_api.rb +36 -10
- data/lib/aws-sdk-sts/customizations.rb +5 -1
- data/lib/aws-sdk-sts/endpoint_parameters.rb +10 -9
- data/lib/aws-sdk-sts/endpoint_provider.rb +50 -55
- data/lib/aws-sdk-sts/endpoints.rb +2 -118
- data/lib/aws-sdk-sts/errors.rb +16 -0
- data/lib/aws-sdk-sts/plugins/endpoints.rb +19 -28
- data/lib/aws-sdk-sts/types.rb +171 -28
- data/lib/aws-sdk-sts.rb +15 -11
- data/lib/seahorse/client/async_base.rb +4 -5
- data/lib/seahorse/client/base.rb +17 -21
- data/lib/seahorse/client/h2/connection.rb +18 -28
- data/lib/seahorse/client/h2/handler.rb +13 -3
- data/lib/seahorse/client/handler.rb +1 -1
- data/lib/seahorse/client/http/response.rb +1 -1
- data/lib/seahorse/client/net_http/connection_pool.rb +10 -2
- data/lib/seahorse/client/net_http/handler.rb +21 -9
- data/lib/seahorse/client/networking_error.rb +1 -1
- data/lib/seahorse/client/plugins/endpoint.rb +0 -1
- data/lib/seahorse/client/plugins/h2.rb +4 -4
- data/lib/seahorse/client/plugins/net_http.rb +9 -0
- data/lib/seahorse/client/request_context.rb +8 -1
- data/lib/seahorse/client/response.rb +2 -0
- data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
- data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
- data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
- data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
- data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
- data/sig/seahorse/client/async_base.rbs +18 -0
- metadata +80 -24
- /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
@@ -15,27 +15,11 @@ module Aws
|
|
15
15
|
|
16
16
|
# @api private
|
17
17
|
def setup_stubbing
|
18
|
-
@stubs = {}
|
19
|
-
@stub_mutex = Mutex.new
|
20
18
|
if Hash === @config.stub_responses
|
21
19
|
@config.stub_responses.each do |operation_name, stubs|
|
22
20
|
apply_stubs(operation_name, Array === stubs ? stubs : [stubs])
|
23
21
|
end
|
24
22
|
end
|
25
|
-
|
26
|
-
# When a client is stubbed allow the user to access the requests made
|
27
|
-
requests = @api_requests = []
|
28
|
-
requests_mutex = @requests_mutex = Mutex.new
|
29
|
-
self.handle do |context|
|
30
|
-
requests_mutex.synchronize do
|
31
|
-
requests << {
|
32
|
-
operation_name: context.operation_name,
|
33
|
-
params: context.params,
|
34
|
-
context: context
|
35
|
-
}
|
36
|
-
end
|
37
|
-
@handler.call(context)
|
38
|
-
end
|
39
23
|
end
|
40
24
|
|
41
25
|
# Configures what data / errors should be returned from the named operation
|
@@ -175,7 +159,7 @@ module Aws
|
|
175
159
|
# on a client that has not enabled response stubbing via
|
176
160
|
# `:stub_responses => true`.
|
177
161
|
def stub_responses(operation_name, *stubs)
|
178
|
-
if config.stub_responses
|
162
|
+
if @config.stub_responses
|
179
163
|
apply_stubs(operation_name, stubs.flatten)
|
180
164
|
else
|
181
165
|
msg = 'stubbing is not enabled; enable stubbing in the constructor '\
|
@@ -194,12 +178,12 @@ module Aws
|
|
194
178
|
# @raise [NotImplementedError] Raises `NotImplementedError` when the client
|
195
179
|
# is not stubbed.
|
196
180
|
def api_requests(options = {})
|
197
|
-
if config.stub_responses
|
198
|
-
@
|
181
|
+
if @config.stub_responses
|
182
|
+
@config.api_requests_mutex.synchronize do
|
199
183
|
if options[:exclude_presign]
|
200
|
-
@api_requests.reject {|req| req[:context][:presigned_url] }
|
184
|
+
@config.api_requests.reject {|req| req[:context][:presigned_url] }
|
201
185
|
else
|
202
|
-
@api_requests
|
186
|
+
@config.api_requests
|
203
187
|
end
|
204
188
|
end
|
205
189
|
else
|
@@ -228,54 +212,44 @@ module Aws
|
|
228
212
|
# @return [Structure] Returns a stubbed response data structure. The
|
229
213
|
# actual class returned will depend on the given `operation_name`.
|
230
214
|
def stub_data(operation_name, data = {})
|
231
|
-
Stubbing::StubData.new(config.api.operation(operation_name)).stub(data)
|
215
|
+
Stubbing::StubData.new(@config.api.operation(operation_name)).stub(data)
|
232
216
|
end
|
233
217
|
|
234
218
|
# @api private
|
235
219
|
def next_stub(context)
|
236
220
|
operation_name = context.operation_name.to_sym
|
237
|
-
stub = @
|
238
|
-
stubs = @stubs[operation_name] || []
|
221
|
+
stub = @config.stubs_mutex.synchronize do
|
222
|
+
stubs = @config.stubs[operation_name] || []
|
239
223
|
case stubs.length
|
240
|
-
when 0 then
|
224
|
+
when 0 then stub_data(operation_name)
|
241
225
|
when 1 then stubs.first
|
242
226
|
else stubs.shift
|
243
227
|
end
|
244
228
|
end
|
245
|
-
|
229
|
+
stub = convert_stub(operation_name, stub, context)
|
230
|
+
stub[:mutex] = Mutex.new
|
231
|
+
stub
|
246
232
|
end
|
247
233
|
|
248
234
|
private
|
249
235
|
|
250
|
-
def
|
251
|
-
|
252
|
-
|
236
|
+
def apply_stubs(operation_name, stubs)
|
237
|
+
@config.stubs_mutex.synchronize do
|
238
|
+
@config.stubs[operation_name.to_sym] = stubs
|
239
|
+
end
|
253
240
|
end
|
254
241
|
|
255
242
|
# This method converts the given stub data and converts it to a
|
256
243
|
# HTTP response (when possible). This enables the response stubbing
|
257
244
|
# plugin to provide a HTTP response that triggers all normal events
|
258
245
|
# during response handling.
|
259
|
-
def
|
260
|
-
|
261
|
-
|
262
|
-
convert_stub(operation_name, stub)
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
def convert_stub(operation_name, stub)
|
268
|
-
stub = case stub
|
269
|
-
when Proc then stub
|
246
|
+
def convert_stub(operation_name, stub, context)
|
247
|
+
case stub
|
248
|
+
when Proc then convert_stub(operation_name, stub.call(context), context)
|
270
249
|
when Exception, Class then { error: stub }
|
271
250
|
when String then service_error_stub(stub)
|
272
|
-
|
273
|
-
else { data: stub }
|
274
|
-
end
|
275
|
-
if Hash === stub
|
276
|
-
stub[:mutex] = Mutex.new
|
251
|
+
else http_response_stub(operation_name, stub)
|
277
252
|
end
|
278
|
-
stub
|
279
253
|
end
|
280
254
|
|
281
255
|
def service_error_stub(error_code)
|
@@ -299,21 +273,22 @@ module Aws
|
|
299
273
|
end
|
300
274
|
|
301
275
|
def data_to_http_resp(operation_name, data)
|
302
|
-
api = config.api
|
276
|
+
api = @config.api
|
303
277
|
operation = api.operation(operation_name)
|
304
278
|
ParamValidator.new(operation.output, input: false).validate!(data)
|
305
279
|
protocol_helper.stub_data(api, operation, data)
|
306
280
|
end
|
307
281
|
|
308
282
|
def protocol_helper
|
309
|
-
case config.api.metadata['protocol']
|
310
|
-
when 'json'
|
311
|
-
when '
|
312
|
-
when '
|
313
|
-
when '
|
314
|
-
when '
|
315
|
-
when '
|
316
|
-
|
283
|
+
case @config.api.metadata['protocol']
|
284
|
+
when 'json' then Stubbing::Protocols::Json
|
285
|
+
when 'rest-json' then Stubbing::Protocols::RestJson
|
286
|
+
when 'rest-xml' then Stubbing::Protocols::RestXml
|
287
|
+
when 'query' then Stubbing::Protocols::Query
|
288
|
+
when 'ec2' then Stubbing::Protocols::EC2
|
289
|
+
when 'smithy-rpc-v2-cbor' then Stubbing::Protocols::RpcV2
|
290
|
+
when 'api-gateway' then Stubbing::Protocols::ApiGateway
|
291
|
+
else raise 'unsupported protocol'
|
317
292
|
end.new
|
318
293
|
end
|
319
294
|
end
|
@@ -42,11 +42,14 @@ module Aws
|
|
42
42
|
|
43
43
|
def static_credentials(options)
|
44
44
|
if options[:config]
|
45
|
-
Credentials.new(
|
45
|
+
creds = Credentials.new(
|
46
46
|
options[:config].access_key_id,
|
47
47
|
options[:config].secret_access_key,
|
48
|
-
options[:config].session_token
|
48
|
+
options[:config].session_token,
|
49
|
+
account_id: options[:config].account_id
|
49
50
|
)
|
51
|
+
creds.metrics = ['CREDENTIALS_PROFILE']
|
52
|
+
creds
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
@@ -75,7 +78,9 @@ module Aws
|
|
75
78
|
|
76
79
|
def static_profile_credentials(options)
|
77
80
|
if options[:config] && options[:config].profile
|
78
|
-
SharedCredentials.new(profile_name: options[:config].profile)
|
81
|
+
creds = SharedCredentials.new(profile_name: options[:config].profile)
|
82
|
+
creds.metrics = ['CREDENTIALS_PROFILE']
|
83
|
+
creds
|
79
84
|
end
|
80
85
|
rescue Errors::NoSuchProfileError
|
81
86
|
nil
|
@@ -84,7 +89,11 @@ module Aws
|
|
84
89
|
def static_profile_process_credentials(options)
|
85
90
|
if Aws.shared_config.config_enabled? && options[:config] && options[:config].profile
|
86
91
|
process_provider = Aws.shared_config.credential_process(profile: options[:config].profile)
|
87
|
-
|
92
|
+
if process_provider
|
93
|
+
creds = ProcessCredentials.new([process_provider])
|
94
|
+
creds.metrics << 'CREDENTIALS_PROFILE_PROCESS'
|
95
|
+
creds
|
96
|
+
end
|
88
97
|
end
|
89
98
|
rescue Errors::NoSuchProfileError
|
90
99
|
nil
|
@@ -94,7 +103,15 @@ module Aws
|
|
94
103
|
key = %w[AWS_ACCESS_KEY_ID AMAZON_ACCESS_KEY_ID AWS_ACCESS_KEY]
|
95
104
|
secret = %w[AWS_SECRET_ACCESS_KEY AMAZON_SECRET_ACCESS_KEY AWS_SECRET_KEY]
|
96
105
|
token = %w[AWS_SESSION_TOKEN AMAZON_SESSION_TOKEN]
|
97
|
-
|
106
|
+
account_id = %w[AWS_ACCOUNT_ID]
|
107
|
+
creds = Credentials.new(
|
108
|
+
envar(key),
|
109
|
+
envar(secret),
|
110
|
+
envar(token),
|
111
|
+
account_id: envar(account_id)
|
112
|
+
)
|
113
|
+
creds.metrics = ['CREDENTIALS_ENV_VARS']
|
114
|
+
creds
|
98
115
|
end
|
99
116
|
|
100
117
|
def envar(keys)
|
@@ -110,16 +127,22 @@ module Aws
|
|
110
127
|
|
111
128
|
def shared_credentials(options)
|
112
129
|
profile_name = determine_profile_name(options)
|
113
|
-
SharedCredentials.new(profile_name: profile_name)
|
130
|
+
creds = SharedCredentials.new(profile_name: profile_name)
|
131
|
+
creds.metrics = ['CREDENTIALS_PROFILE']
|
132
|
+
creds
|
114
133
|
rescue Errors::NoSuchProfileError
|
115
134
|
nil
|
116
135
|
end
|
117
136
|
|
118
137
|
def process_credentials(options)
|
119
138
|
profile_name = determine_profile_name(options)
|
120
|
-
if Aws.shared_config.config_enabled?
|
121
|
-
|
122
|
-
|
139
|
+
if Aws.shared_config.config_enabled?
|
140
|
+
process_provider = Aws.shared_config.credential_process(profile: profile_name)
|
141
|
+
if process_provider
|
142
|
+
creds = ProcessCredentials.new([process_provider])
|
143
|
+
creds.metrics << 'CREDENTIALS_PROFILE_PROCESS'
|
144
|
+
creds
|
145
|
+
end
|
123
146
|
end
|
124
147
|
rescue Errors::NoSuchProfileError
|
125
148
|
nil
|
@@ -149,7 +172,11 @@ module Aws
|
|
149
172
|
role_session_name: ENV['AWS_ROLE_SESSION_NAME']
|
150
173
|
}
|
151
174
|
cfg[:region] = region if region
|
152
|
-
|
175
|
+
Aws::Plugins::UserAgent.metric('CREDENTIALS_ENV_VARS_STS_WEB_ID_TOKEN') do
|
176
|
+
creds = AssumeRoleWebIdentityCredentials.new(cfg)
|
177
|
+
creds.metrics << 'CREDENTIALS_ENV_VARS_STS_WEB_ID_TOKEN'
|
178
|
+
creds
|
179
|
+
end
|
153
180
|
elsif Aws.shared_config.config_enabled?
|
154
181
|
profile = options[:config].profile if options[:config]
|
155
182
|
Aws.shared_config.assume_role_web_identity_credentials_from_config(
|
@@ -6,21 +6,34 @@ module Aws
|
|
6
6
|
# @param [String] access_key_id
|
7
7
|
# @param [String] secret_access_key
|
8
8
|
# @param [String] session_token (nil)
|
9
|
-
|
9
|
+
# @param [Hash] kwargs
|
10
|
+
# @option kwargs [String] :credential_scope (nil)
|
11
|
+
def initialize(access_key_id, secret_access_key, session_token = nil,
|
12
|
+
**kwargs)
|
10
13
|
@access_key_id = access_key_id
|
11
14
|
@secret_access_key = secret_access_key
|
12
15
|
@session_token = session_token
|
16
|
+
@account_id = kwargs[:account_id]
|
17
|
+
@metrics = ['CREDENTIALS_CODE']
|
13
18
|
end
|
14
19
|
|
15
|
-
# @return [String
|
20
|
+
# @return [String]
|
16
21
|
attr_reader :access_key_id
|
17
22
|
|
18
|
-
# @return [String
|
23
|
+
# @return [String]
|
19
24
|
attr_reader :secret_access_key
|
20
25
|
|
21
26
|
# @return [String, nil]
|
22
27
|
attr_reader :session_token
|
23
28
|
|
29
|
+
# @return [String, nil]
|
30
|
+
attr_reader :account_id
|
31
|
+
|
32
|
+
# @api private
|
33
|
+
# Returns the credentials source. Used for tracking credentials
|
34
|
+
# related UserAgent metrics.
|
35
|
+
attr_accessor :metrics
|
36
|
+
|
24
37
|
# @return [Credentials]
|
25
38
|
def credentials
|
26
39
|
self
|
@@ -30,9 +43,9 @@ module Aws
|
|
30
43
|
# access key are both set.
|
31
44
|
def set?
|
32
45
|
!access_key_id.nil? &&
|
33
|
-
|
34
|
-
|
35
|
-
|
46
|
+
!access_key_id.empty? &&
|
47
|
+
!secret_access_key.nil? &&
|
48
|
+
!secret_access_key.empty?
|
36
49
|
end
|
37
50
|
|
38
51
|
# Removing the secret access key from the default inspect string.
|
@@ -3,15 +3,17 @@
|
|
3
3
|
module Aws
|
4
4
|
module Endpoints
|
5
5
|
class Endpoint
|
6
|
-
def initialize(url:, properties: {}, headers: {})
|
6
|
+
def initialize(url:, properties: {}, headers: {}, metadata: {})
|
7
7
|
@url = url
|
8
8
|
@properties = properties
|
9
9
|
@headers = headers
|
10
|
+
@metadata = metadata
|
10
11
|
end
|
11
12
|
|
12
13
|
attr_reader :url
|
13
14
|
attr_reader :properties
|
14
15
|
attr_reader :headers
|
16
|
+
attr_reader :metadata
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
@@ -94,14 +94,7 @@ module Aws
|
|
94
94
|
|
95
95
|
# aws.partition(value: string) Option<Partition>
|
96
96
|
def self.aws_partition(value)
|
97
|
-
partition
|
98
|
-
Aws::Partitions.find { |p| p.region?(value) } ||
|
99
|
-
Aws::Partitions.find { |p| value.match(p.region_regex) } ||
|
100
|
-
Aws::Partitions.find { |p| p.name == 'aws' }
|
101
|
-
|
102
|
-
return nil unless partition
|
103
|
-
|
104
|
-
partition.metadata
|
97
|
+
Aws::Partitions::Metadata.partition(value)
|
105
98
|
end
|
106
99
|
|
107
100
|
# aws.parseArn(value: string) Option<ARN>
|
@@ -14,9 +14,18 @@ require_relative 'endpoints/templater'
|
|
14
14
|
require_relative 'endpoints/tree_rule'
|
15
15
|
require_relative 'endpoints/url'
|
16
16
|
|
17
|
+
require 'aws-sigv4'
|
18
|
+
|
17
19
|
module Aws
|
18
20
|
# @api private
|
19
21
|
module Endpoints
|
22
|
+
SUPPORTED_AUTH_TRAITS = %w[
|
23
|
+
aws.auth#sigv4
|
24
|
+
aws.auth#sigv4a
|
25
|
+
smithy.api#httpBearerAuth
|
26
|
+
smithy.api#noAuth
|
27
|
+
].freeze
|
28
|
+
|
20
29
|
class << self
|
21
30
|
def resolve_auth_scheme(context, endpoint)
|
22
31
|
if endpoint && (auth_schemes = endpoint.properties['authSchemes'])
|
@@ -33,8 +42,71 @@ module Aws
|
|
33
42
|
|
34
43
|
private
|
35
44
|
|
45
|
+
def merge_signing_defaults(auth_scheme, config)
|
46
|
+
if %w[sigv4 sigv4a sigv4-s3express].include?(auth_scheme['name'])
|
47
|
+
auth_scheme['signingName'] ||= sigv4_name(config)
|
48
|
+
|
49
|
+
# back fill disableNormalizePath for S3 until it gets correctly set in the rules
|
50
|
+
if auth_scheme['signingName'] == 's3' &&
|
51
|
+
!auth_scheme.include?('disableNormalizePath') &&
|
52
|
+
auth_scheme.include?('disableDoubleEncoding')
|
53
|
+
auth_scheme['disableNormalizePath'] = auth_scheme['disableDoubleEncoding']
|
54
|
+
end
|
55
|
+
if auth_scheme['name'] == 'sigv4a'
|
56
|
+
# config option supersedes endpoint properties
|
57
|
+
auth_scheme['signingRegionSet'] =
|
58
|
+
config.sigv4a_signing_region_set || auth_scheme['signingRegionSet'] || [config.region]
|
59
|
+
else
|
60
|
+
auth_scheme['signingRegion'] ||= config.region
|
61
|
+
end
|
62
|
+
end
|
63
|
+
auth_scheme
|
64
|
+
end
|
65
|
+
|
66
|
+
def sigv4_name(config)
|
67
|
+
config.api.metadata['signingName'] ||
|
68
|
+
config.api.metadata['endpointPrefix']
|
69
|
+
end
|
70
|
+
|
36
71
|
def default_auth_scheme(context)
|
37
|
-
|
72
|
+
if (auth_list = default_api_auth(context))
|
73
|
+
auth = auth_list.find { |a| SUPPORTED_AUTH_TRAITS.include?(a) }
|
74
|
+
case auth
|
75
|
+
when 'aws.auth#sigv4', 'aws.auth#sigv4a'
|
76
|
+
auth_scheme = { 'name' => auth.split('#').last }
|
77
|
+
if s3_or_s3v4_signature_version?(context)
|
78
|
+
auth_scheme = auth_scheme.merge(
|
79
|
+
'disableDoubleEncoding' => true,
|
80
|
+
'disableNormalizePath' => true
|
81
|
+
)
|
82
|
+
end
|
83
|
+
merge_signing_defaults(auth_scheme, context.config)
|
84
|
+
when 'smithy.api#httpBearerAuth'
|
85
|
+
{ 'name' => 'bearer' }
|
86
|
+
when 'smithy.api#noAuth'
|
87
|
+
{ 'name' => 'none' }
|
88
|
+
else
|
89
|
+
raise 'No supported auth trait for this endpoint.'
|
90
|
+
end
|
91
|
+
else
|
92
|
+
legacy_default_auth_scheme(context)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def default_api_auth(context)
|
97
|
+
context.config.api.operation(context.operation_name)['auth'] ||
|
98
|
+
context.config.api.metadata['auth']
|
99
|
+
end
|
100
|
+
|
101
|
+
def s3_or_s3v4_signature_version?(context)
|
102
|
+
%w[s3 s3v4].include?(context.config.api.metadata['signatureVersion'])
|
103
|
+
end
|
104
|
+
|
105
|
+
# Legacy auth resolution - looks for deprecated signatureVersion
|
106
|
+
# and authType traits.
|
107
|
+
|
108
|
+
def legacy_default_auth_scheme(context)
|
109
|
+
case legacy_default_api_authtype(context)
|
38
110
|
when 'v4', 'v4-unsigned-body'
|
39
111
|
auth_scheme = { 'name' => 'sigv4' }
|
40
112
|
merge_signing_defaults(auth_scheme, context.config)
|
@@ -52,27 +124,11 @@ module Aws
|
|
52
124
|
end
|
53
125
|
end
|
54
126
|
|
55
|
-
def
|
56
|
-
if %w[sigv4 sigv4a sigv4-s3express].include?(auth_scheme['name'])
|
57
|
-
auth_scheme['signingName'] ||= sigv4_name(config)
|
58
|
-
if auth_scheme['name'] == 'sigv4a'
|
59
|
-
auth_scheme['signingRegionSet'] ||= ['*']
|
60
|
-
else
|
61
|
-
auth_scheme['signingRegion'] ||= config.region
|
62
|
-
end
|
63
|
-
end
|
64
|
-
auth_scheme
|
65
|
-
end
|
66
|
-
|
67
|
-
def default_api_authtype(context)
|
127
|
+
def legacy_default_api_authtype(context)
|
68
128
|
context.config.api.operation(context.operation_name)['authtype'] ||
|
69
129
|
context.config.api.metadata['signatureVersion']
|
70
130
|
end
|
71
131
|
|
72
|
-
def sigv4_name(config)
|
73
|
-
config.api.metadata['signingName'] ||
|
74
|
-
config.api.metadata['endpointPrefix']
|
75
|
-
end
|
76
132
|
end
|
77
133
|
end
|
78
134
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
class ErrorHandler < Seahorse::Client::Handler
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def error(context)
|
9
|
+
body = context.http_response.body_contents
|
10
|
+
if body.empty?
|
11
|
+
code, message, data = http_status_error(context)
|
12
|
+
else
|
13
|
+
code, message, data = extract_error(body, context)
|
14
|
+
end
|
15
|
+
build_error(context, code, message, data)
|
16
|
+
end
|
17
|
+
|
18
|
+
def build_error(context, code, message, data)
|
19
|
+
errors_module = context.client.class.errors_module
|
20
|
+
errors_module.error_class(code).new(context, message, data)
|
21
|
+
end
|
22
|
+
|
23
|
+
def http_status_error(context)
|
24
|
+
[http_status_error_code(context), '', EmptyStructure.new]
|
25
|
+
end
|
26
|
+
|
27
|
+
def http_status_error_code(context)
|
28
|
+
status_code = context.http_response.status_code
|
29
|
+
{
|
30
|
+
302 => 'MovedTemporarily',
|
31
|
+
304 => 'NotModified',
|
32
|
+
400 => 'BadRequest',
|
33
|
+
403 => 'Forbidden',
|
34
|
+
404 => 'NotFound',
|
35
|
+
412 => 'PreconditionFailed',
|
36
|
+
413 => 'RequestEntityTooLarge',
|
37
|
+
}[status_code] || "Http#{status_code}Error"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/aws-sdk-core/errors.rb
CHANGED
@@ -68,7 +68,7 @@ module Aws
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
#
|
71
|
+
# Raised when endpoint discovery failed for operations
|
72
72
|
# that requires endpoints from endpoint discovery
|
73
73
|
class EndpointDiscoveryError < RuntimeError
|
74
74
|
def initialize(*args)
|
@@ -78,7 +78,7 @@ module Aws
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
#
|
81
|
+
# Raised when hostLabel member is not provided
|
82
82
|
# at operation input when endpoint trait is available
|
83
83
|
# with 'hostPrefix' requirement
|
84
84
|
class MissingEndpointHostLabelValue < RuntimeError
|
@@ -236,6 +236,15 @@ module Aws
|
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
239
|
+
# Raised when a client is constructed and the sigv4a region set is invalid.
|
240
|
+
# It is invalid when it is empty and/or contains empty strings.
|
241
|
+
class InvalidRegionSetError < ArgumentError
|
242
|
+
def initialize(*args)
|
243
|
+
msg = 'The provided sigv4a region set was empty or invalid.'
|
244
|
+
super(msg)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
239
248
|
# Raised when a client is contsructed and the region is not valid.
|
240
249
|
class InvalidRegionError < ArgumentError
|
241
250
|
def initialize(*args)
|
@@ -2,10 +2,8 @@
|
|
2
2
|
|
3
3
|
module Aws
|
4
4
|
module Json
|
5
|
-
class ErrorHandler <
|
5
|
+
class ErrorHandler < Aws::ErrorHandler
|
6
6
|
|
7
|
-
# @param [Seahorse::Client::RequestContext] context
|
8
|
-
# @return [Seahorse::Client::Response]
|
9
7
|
def call(context)
|
10
8
|
@handler.call(context).on(300..599) do |response|
|
11
9
|
response.error = error(context)
|
@@ -19,7 +17,7 @@ module Aws
|
|
19
17
|
json = Json.load(body)
|
20
18
|
code = error_code(json, context)
|
21
19
|
message = error_message(code, json)
|
22
|
-
data = parse_error_data(context, code)
|
20
|
+
data = parse_error_data(context, body, code)
|
23
21
|
[code, message, data]
|
24
22
|
rescue Json::ParseError
|
25
23
|
[http_status_error_code(context), '', EmptyStructure.new]
|
@@ -28,7 +26,8 @@ module Aws
|
|
28
26
|
def error_code(json, context)
|
29
27
|
code =
|
30
28
|
if aws_query_error?(context)
|
31
|
-
|
29
|
+
query_header = context.http_response.headers['x-amzn-query-error']
|
30
|
+
error, _type = query_header.split(';') # type not supported
|
32
31
|
remove_prefix(error, context)
|
33
32
|
else
|
34
33
|
json['__type']
|
@@ -48,7 +47,7 @@ module Aws
|
|
48
47
|
end
|
49
48
|
|
50
49
|
def remove_prefix(error_code, context)
|
51
|
-
if prefix = context.config.api.metadata['errorPrefix']
|
50
|
+
if (prefix = context.config.api.metadata['errorPrefix'])
|
52
51
|
error_code.sub(/^#{prefix}/, '')
|
53
52
|
else
|
54
53
|
error_code
|
@@ -63,9 +62,9 @@ module Aws
|
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
|
-
def parse_error_data(context, code)
|
65
|
+
def parse_error_data(context, body, code)
|
67
66
|
data = EmptyStructure.new
|
68
|
-
if error_rules = context.operation.errors
|
67
|
+
if (error_rules = context.operation.errors)
|
69
68
|
error_rules.each do |rule|
|
70
69
|
# match modeled shape name with the type(code) only
|
71
70
|
# some type(code) might contains invalid characters
|
@@ -73,7 +72,7 @@ module Aws
|
|
73
72
|
match = rule.shape.name == code.gsub(/[^^a-zA-Z0-9]/, '')
|
74
73
|
next unless match && rule.shape.members.any?
|
75
74
|
|
76
|
-
data = Parser.new(rule).parse(
|
75
|
+
data = Parser.new(rule).parse(body)
|
77
76
|
# errors support HTTP bindings
|
78
77
|
apply_error_headers(rule, context, data)
|
79
78
|
end
|
@@ -12,8 +12,7 @@ module Aws
|
|
12
12
|
build_request(context)
|
13
13
|
response = @handler.call(context)
|
14
14
|
response.on(200..299) { |resp| parse_response(resp) }
|
15
|
-
response.on(200..599) { |
|
16
|
-
response
|
15
|
+
response.on(200..599) { |_resp| apply_request_id(context) }
|
17
16
|
end
|
18
17
|
|
19
18
|
private
|
@@ -22,6 +21,7 @@ module Aws
|
|
22
21
|
context.http_request.http_method = 'POST'
|
23
22
|
context.http_request.headers['Content-Type'] = content_type(context)
|
24
23
|
context.http_request.headers['X-Amz-Target'] = target(context)
|
24
|
+
context.http_request.headers['X-Amzn-Query-Mode'] = 'true' if query_compatible?(context)
|
25
25
|
context.http_request.body = build_body(context)
|
26
26
|
end
|
27
27
|
|
@@ -38,10 +38,10 @@ module Aws
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def parse_body(context)
|
41
|
+
json = context.http_response.body_contents
|
41
42
|
if simple_json?(context)
|
42
|
-
Json.load(
|
43
|
-
elsif rules = context.operation.output
|
44
|
-
json = context.http_response.body_contents
|
43
|
+
Json.load(json)
|
44
|
+
elsif (rules = context.operation.output)
|
45
45
|
if json.is_a?(Array)
|
46
46
|
# an array of emitted events
|
47
47
|
if json[0].respond_to?(:response)
|
@@ -62,7 +62,7 @@ module Aws
|
|
62
62
|
Parser.new(
|
63
63
|
rules,
|
64
64
|
query_compatible: query_compatible?(context)
|
65
|
-
).parse(json
|
65
|
+
).parse(json)
|
66
66
|
end
|
67
67
|
else
|
68
68
|
EmptyStructure.new
|