aws-sdk-core 3.152.0 → 3.234.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/CHANGELOG.md +942 -1
- data/VERSION +1 -1
- data/lib/aws-defaults/default_configuration.rb +5 -6
- data/lib/aws-defaults.rb +4 -1
- data/lib/aws-sdk-core/arn.rb +14 -3
- data/lib/aws-sdk-core/assume_role_credentials.rb +21 -13
- data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +16 -9
- data/lib/aws-sdk-core/binary/decode_handler.rb +3 -9
- data/lib/aws-sdk-core/binary/encode_handler.rb +13 -2
- data/lib/aws-sdk-core/binary/event_builder.rb +34 -37
- 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 +33 -55
- data/lib/aws-sdk-core/credential_provider.rb +8 -1
- data/lib/aws-sdk-core/credential_provider_chain.rb +81 -29
- data/lib/aws-sdk-core/credentials.rb +19 -6
- data/lib/aws-sdk-core/ec2_metadata.rb +1 -1
- data/lib/aws-sdk-core/ecs_credentials.rb +186 -60
- data/lib/aws-sdk-core/endpoints/condition.rb +41 -0
- data/lib/aws-sdk-core/endpoints/endpoint.rb +19 -0
- data/lib/aws-sdk-core/endpoints/endpoint_rule.rb +75 -0
- data/lib/aws-sdk-core/endpoints/error_rule.rb +42 -0
- data/lib/aws-sdk-core/endpoints/function.rb +80 -0
- data/lib/aws-sdk-core/endpoints/matchers.rb +129 -0
- data/lib/aws-sdk-core/endpoints/reference.rb +31 -0
- data/lib/aws-sdk-core/endpoints/rule.rb +25 -0
- data/lib/aws-sdk-core/endpoints/rule_set.rb +52 -0
- data/lib/aws-sdk-core/endpoints/rules_provider.rb +37 -0
- data/lib/aws-sdk-core/endpoints/templater.rb +58 -0
- data/lib/aws-sdk-core/endpoints/tree_rule.rb +45 -0
- data/lib/aws-sdk-core/endpoints/url.rb +60 -0
- data/lib/aws-sdk-core/endpoints.rb +158 -0
- data/lib/aws-sdk-core/error_handler.rb +46 -0
- data/lib/aws-sdk-core/errors.rb +14 -5
- data/lib/aws-sdk-core/event_emitter.rb +1 -17
- data/lib/aws-sdk-core/ini_parser.rb +7 -0
- data/lib/aws-sdk-core/instance_profile_credentials.rb +168 -155
- data/lib/aws-sdk-core/json/builder.rb +8 -1
- data/lib/aws-sdk-core/json/error_handler.rb +46 -11
- data/lib/aws-sdk-core/json/handler.rb +13 -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 +33 -3
- data/lib/aws-sdk-core/json.rb +43 -14
- data/lib/aws-sdk-core/log/formatter.rb +6 -0
- 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/lru_cache.rb +75 -0
- data/lib/aws-sdk-core/pageable_response.rb +3 -1
- data/lib/aws-sdk-core/param_validator.rb +9 -4
- data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
- data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +348 -169
- data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
- data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
- data/lib/aws-sdk-core/plugins/credentials_configuration.rb +84 -38
- data/lib/aws-sdk-core/plugins/endpoint_discovery.rb +6 -2
- 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 +3 -8
- data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
- data/lib/aws-sdk-core/plugins/logging.rb +2 -0
- 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 +3 -15
- data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
- data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
- data/lib/aws-sdk-core/plugins/regional_endpoint.rb +164 -34
- data/lib/aws-sdk-core/plugins/request_compression.rb +226 -0
- data/lib/aws-sdk-core/plugins/retries/error_inspector.rb +2 -1
- data/lib/aws-sdk-core/plugins/retry_errors.rb +12 -3
- data/lib/aws-sdk-core/plugins/sign.rb +222 -0
- data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -0
- data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -0
- data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -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 +192 -14
- data/lib/aws-sdk-core/plugins.rb +39 -0
- data/lib/aws-sdk-core/process_credentials.rb +48 -29
- data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
- data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
- data/lib/aws-sdk-core/query/handler.rb +4 -4
- data/lib/aws-sdk-core/query/param_builder.rb +2 -2
- data/lib/aws-sdk-core/query.rb +2 -1
- data/lib/aws-sdk-core/refreshing_credentials.rb +20 -23
- data/lib/aws-sdk-core/resources.rb +8 -0
- data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
- data/lib/aws-sdk-core/rest/handler.rb +3 -4
- data/lib/aws-sdk-core/rest/request/body.rb +32 -5
- data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
- data/lib/aws-sdk-core/rest/request/headers.rb +14 -10
- data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
- data/lib/aws-sdk-core/rest/response/body.rb +15 -1
- data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
- data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
- data/lib/aws-sdk-core/rest.rb +1 -0
- 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 +95 -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 +160 -36
- data/lib/aws-sdk-core/shared_credentials.rb +1 -7
- data/lib/aws-sdk-core/sso_credentials.rb +84 -46
- data/lib/aws-sdk-core/sso_token_provider.rb +3 -2
- data/lib/aws-sdk-core/static_token_provider.rb +1 -2
- 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/stub_data.rb +11 -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/token.rb +3 -3
- data/lib/aws-sdk-core/token_provider.rb +4 -0
- data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
- data/lib/aws-sdk-core/util.rb +41 -1
- data/lib/aws-sdk-core/waiters/poller.rb +12 -5
- data/lib/aws-sdk-core/xml/builder.rb +17 -9
- data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
- data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
- data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +2 -0
- data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
- data/lib/aws-sdk-core/xml/parser.rb +2 -6
- data/lib/aws-sdk-core.rb +82 -103
- data/lib/aws-sdk-sso/client.rb +219 -89
- data/lib/aws-sdk-sso/client_api.rb +7 -0
- data/lib/aws-sdk-sso/endpoint_parameters.rb +69 -0
- data/lib/aws-sdk-sso/endpoint_provider.rb +53 -0
- data/lib/aws-sdk-sso/endpoints.rb +20 -0
- data/lib/aws-sdk-sso/plugins/endpoints.rb +77 -0
- data/lib/aws-sdk-sso/types.rb +1 -35
- data/lib/aws-sdk-sso.rb +15 -7
- data/lib/aws-sdk-ssooidc/client.rb +650 -118
- data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
- data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +69 -0
- data/lib/aws-sdk-ssooidc/endpoint_provider.rb +53 -0
- data/lib/aws-sdk-ssooidc/endpoints.rb +20 -0
- data/lib/aws-sdk-ssooidc/errors.rb +62 -0
- data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +77 -0
- data/lib/aws-sdk-ssooidc/types.rb +437 -67
- data/lib/aws-sdk-ssooidc.rb +15 -7
- data/lib/aws-sdk-sts/client.rb +670 -368
- data/lib/aws-sdk-sts/client_api.rb +48 -9
- data/lib/aws-sdk-sts/customizations.rb +5 -2
- data/lib/aws-sdk-sts/endpoint_parameters.rb +79 -0
- data/lib/aws-sdk-sts/endpoint_provider.rb +107 -0
- data/lib/aws-sdk-sts/endpoints.rb +20 -0
- data/lib/aws-sdk-sts/errors.rb +15 -0
- data/lib/aws-sdk-sts/plugins/endpoints.rb +77 -0
- data/lib/aws-sdk-sts/presigner.rb +12 -18
- data/lib/aws-sdk-sts/types.rb +296 -222
- data/lib/aws-sdk-sts.rb +15 -7
- data/lib/seahorse/client/async_base.rb +4 -6
- data/lib/seahorse/client/async_response.rb +19 -0
- data/lib/seahorse/client/base.rb +18 -21
- data/lib/seahorse/client/configuration.rb +1 -5
- data/lib/seahorse/client/h2/connection.rb +27 -36
- data/lib/seahorse/client/h2/handler.rb +14 -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 +15 -12
- data/lib/seahorse/client/net_http/handler.rb +21 -9
- data/lib/seahorse/client/net_http/patches.rb +1 -4
- data/lib/seahorse/client/networking_error.rb +1 -1
- data/lib/seahorse/client/plugin.rb +9 -0
- 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 +57 -16
- data/lib/seahorse/client/plugins/request_callback.rb +40 -9
- data/lib/seahorse/client/request_context.rb +9 -2
- data/lib/seahorse/client/response.rb +8 -0
- data/lib/seahorse/model/operation.rb +3 -0
- data/lib/seahorse/model/shapes.rb +2 -2
- data/lib/seahorse/util.rb +6 -1
- data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
- data/sig/aws-sdk-core/client_stubs.rbs +10 -0
- data/sig/aws-sdk-core/errors.rbs +22 -0
- data/sig/aws-sdk-core/resources/collection.rbs +21 -0
- data/sig/aws-sdk-core/structure.rbs +4 -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/aws-sdk-core/waiters/errors.rbs +20 -0
- data/sig/aws-sdk-core.rbs +7 -0
- data/sig/seahorse/client/async_base.rbs +18 -0
- data/sig/seahorse/client/base.rbs +25 -0
- data/sig/seahorse/client/handler_builder.rbs +16 -0
- data/sig/seahorse/client/response.rbs +61 -0
- metadata +133 -23
- /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/ox.rb → ox_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "cgi/escape"
|
|
4
|
+
require "cgi/util" if RUBY_VERSION < "3.5"
|
|
5
|
+
|
|
6
|
+
module Aws
|
|
7
|
+
module Endpoints
|
|
8
|
+
# generic matcher functions for service endpoints
|
|
9
|
+
# @api private
|
|
10
|
+
module Matchers
|
|
11
|
+
# Regex that extracts anything in square brackets
|
|
12
|
+
BRACKET_REGEX = /\[(.*?)\]/.freeze
|
|
13
|
+
|
|
14
|
+
# CORE
|
|
15
|
+
|
|
16
|
+
# isSet(value: Option<T>) bool
|
|
17
|
+
def self.set?(value)
|
|
18
|
+
!value.nil?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# not(value: bool) bool
|
|
22
|
+
def self.not(bool)
|
|
23
|
+
!bool
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# getAttr(value: Object | Array, path: string) Document
|
|
27
|
+
def self.attr(value, path)
|
|
28
|
+
parts = path.split('.')
|
|
29
|
+
|
|
30
|
+
val = if (index = parts.first[BRACKET_REGEX, 1])
|
|
31
|
+
# remove brackets and index from part before indexing
|
|
32
|
+
if (base = parts.first.gsub(BRACKET_REGEX, '')) && !base.empty?
|
|
33
|
+
value[base][index.to_i]
|
|
34
|
+
else
|
|
35
|
+
value[index.to_i]
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
value[parts.first]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
if parts.size == 1
|
|
42
|
+
val
|
|
43
|
+
else
|
|
44
|
+
attr(val, parts.slice(1..-1).join('.'))
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.substring(input, start, stop, reverse)
|
|
49
|
+
return nil if start >= stop || input.size < stop
|
|
50
|
+
|
|
51
|
+
return nil if input.chars.any? { |c| c.ord > 127 }
|
|
52
|
+
|
|
53
|
+
return input[start...stop] unless reverse
|
|
54
|
+
|
|
55
|
+
r_start = input.size - stop
|
|
56
|
+
r_stop = input.size - start
|
|
57
|
+
input[r_start...r_stop]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# stringEquals(value1: string, value2: string) bool
|
|
61
|
+
def self.string_equals?(value1, value2)
|
|
62
|
+
value1 == value2
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# booleanEquals(value1: bool, value2: bool) bool
|
|
66
|
+
def self.boolean_equals?(value1, value2)
|
|
67
|
+
value1 == value2
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# uriEncode(value: string) string
|
|
71
|
+
def self.uri_encode(value)
|
|
72
|
+
CGI.escape(value.encode('UTF-8')).gsub('+', '%20').gsub('%7E', '~')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# parseUrl(value: string) Option<URL>
|
|
76
|
+
def self.parse_url(value)
|
|
77
|
+
URL.new(value).as_json
|
|
78
|
+
rescue ArgumentError, URI::InvalidURIError
|
|
79
|
+
nil
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# isValidHostLabel(value: string, allowSubDomains: bool) bool
|
|
83
|
+
def self.valid_host_label?(value, allow_sub_domains = false)
|
|
84
|
+
return false if value.empty?
|
|
85
|
+
|
|
86
|
+
if allow_sub_domains
|
|
87
|
+
labels = value.split('.', -1)
|
|
88
|
+
return labels.all? { |l| valid_host_label?(l) }
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
!!(value =~ /\A(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\z/)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# AWS
|
|
95
|
+
|
|
96
|
+
# aws.partition(value: string) Option<Partition>
|
|
97
|
+
def self.aws_partition(value)
|
|
98
|
+
Aws::Partitions::Metadata.partition(value)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# aws.parseArn(value: string) Option<ARN>
|
|
102
|
+
def self.aws_parse_arn(value)
|
|
103
|
+
arn = Aws::ARNParser.parse(value)
|
|
104
|
+
json = arn.as_json
|
|
105
|
+
# HACK: because of poor naming and also requirement of splitting
|
|
106
|
+
resource = json.delete('resource')
|
|
107
|
+
json['resourceId'] = resource.split(%r{[:\/]}, -1)
|
|
108
|
+
json
|
|
109
|
+
rescue Aws::Errors::InvalidARNError
|
|
110
|
+
nil
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# aws.isVirtualHostableS3Bucket(value: string, allowSubDomains: bool) bool
|
|
114
|
+
def self.aws_virtual_hostable_s3_bucket?(value, allow_sub_domains = false)
|
|
115
|
+
return false if value.empty?
|
|
116
|
+
|
|
117
|
+
if allow_sub_domains
|
|
118
|
+
labels = value.split('.', -1)
|
|
119
|
+
return labels.all? { |l| aws_virtual_hostable_s3_bucket?(l) }
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# must be between 3 and 63 characters long, no uppercase
|
|
123
|
+
value =~ /\A(?!-)[a-z0-9-]{3,63}(?<!-)\z/ &&
|
|
124
|
+
# not an IP address
|
|
125
|
+
value !~ /(\d+\.){3}\d+/
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class Reference
|
|
12
|
+
def initialize(ref:)
|
|
13
|
+
@ref = ref
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
attr_reader :ref
|
|
17
|
+
|
|
18
|
+
def resolve(parameters, assigns)
|
|
19
|
+
if parameters.class.singleton_class::PARAM_MAP.key?(@ref)
|
|
20
|
+
member_name = parameters.class.singleton_class::PARAM_MAP[@ref]
|
|
21
|
+
parameters[member_name]
|
|
22
|
+
elsif assigns.key?(@ref)
|
|
23
|
+
assigns[@ref]
|
|
24
|
+
else
|
|
25
|
+
raise ArgumentError,
|
|
26
|
+
"Reference #{@ref} is not a param or an assigned value."
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class Rule
|
|
12
|
+
# Resolves a value that is a function, reference, or template string.
|
|
13
|
+
def resolve_value(value, parameters, assigns)
|
|
14
|
+
if value.is_a?(Hash) && value['fn']
|
|
15
|
+
Function.new(fn: value['fn'], argv: value['argv'])
|
|
16
|
+
.call(parameters, assigns)
|
|
17
|
+
elsif value.is_a?(Hash) && value['ref']
|
|
18
|
+
Reference.new(ref: value['ref']).resolve(parameters, assigns)
|
|
19
|
+
else
|
|
20
|
+
Templater.resolve(value, parameters, assigns)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class RuleSet
|
|
12
|
+
def initialize(version:, service_id:, parameters:, rules:)
|
|
13
|
+
@version = version
|
|
14
|
+
@service_id = service_id
|
|
15
|
+
@parameters = parameters
|
|
16
|
+
@rules = RuleSet.rules_from_json(rules || [])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :version
|
|
20
|
+
attr_reader :service_id
|
|
21
|
+
attr_reader :parameters
|
|
22
|
+
attr_reader :rules
|
|
23
|
+
|
|
24
|
+
def self.rules_from_json(rules_json)
|
|
25
|
+
rules_json.each.with_object([]) do |rule, rules|
|
|
26
|
+
if rule['type'] == 'endpoint'
|
|
27
|
+
rules << EndpointRule.new(
|
|
28
|
+
conditions: rule['conditions'],
|
|
29
|
+
endpoint: rule['endpoint'],
|
|
30
|
+
documentation: rule['documentation']
|
|
31
|
+
)
|
|
32
|
+
elsif rule['type'] == 'error'
|
|
33
|
+
rules << ErrorRule.new(
|
|
34
|
+
conditions: rule['conditions'],
|
|
35
|
+
error: rule['error'],
|
|
36
|
+
documentation: rule['documentation']
|
|
37
|
+
)
|
|
38
|
+
elsif rule['type'] == 'tree'
|
|
39
|
+
rules << TreeRule.new(
|
|
40
|
+
conditions: rule['conditions'],
|
|
41
|
+
rules: rule['rules'],
|
|
42
|
+
documentation: rule['documentation']
|
|
43
|
+
)
|
|
44
|
+
else
|
|
45
|
+
# should not happen
|
|
46
|
+
raise "Unknown endpoint rule type: #{rule}"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Aws
|
|
2
|
+
module Endpoints
|
|
3
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
4
|
+
# resolution approach. It has been replaced by a code generated
|
|
5
|
+
# approach in each service gem. It can be removed in a new
|
|
6
|
+
# major version. It has to exist because
|
|
7
|
+
# old service gems can use a new core version.
|
|
8
|
+
# @api private
|
|
9
|
+
class RulesProvider
|
|
10
|
+
def initialize(rule_set)
|
|
11
|
+
@rule_set = rule_set
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def resolve_endpoint(parameters)
|
|
15
|
+
obj = resolve_rules(parameters)
|
|
16
|
+
case obj
|
|
17
|
+
when Endpoint
|
|
18
|
+
obj
|
|
19
|
+
when ArgumentError
|
|
20
|
+
raise obj
|
|
21
|
+
else
|
|
22
|
+
raise ArgumentError, 'No endpoint could be resolved'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def resolve_rules(parameters)
|
|
29
|
+
@rule_set.rules.each do |rule|
|
|
30
|
+
output = rule.match(parameters)
|
|
31
|
+
return output if output
|
|
32
|
+
end
|
|
33
|
+
nil
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# Does substitutions for templated endpoint strings
|
|
6
|
+
|
|
7
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
8
|
+
# resolution approach. It has been replaced by a code generated
|
|
9
|
+
# approach in each service gem. It can be removed in a new
|
|
10
|
+
# major version. It has to exist because
|
|
11
|
+
# old service gems can use a new core version.
|
|
12
|
+
# @api private
|
|
13
|
+
module Templater
|
|
14
|
+
class << self
|
|
15
|
+
def resolve(string, parameters, assigns)
|
|
16
|
+
# scans for strings in curly brackets {}
|
|
17
|
+
string.scan(/\{.+?\}/).each do |capture|
|
|
18
|
+
value = capture[1..-2] # strips curly brackets
|
|
19
|
+
string = string.gsub(capture, replace(value, parameters, assigns))
|
|
20
|
+
end
|
|
21
|
+
string
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
# Replaces the captured value with values from parameters or assign
|
|
27
|
+
def replace(capture, parameters, assigns)
|
|
28
|
+
# Pound sigil is used for getAttr calls
|
|
29
|
+
indexes = capture.split('#')
|
|
30
|
+
|
|
31
|
+
# no sigil found, just do substitution
|
|
32
|
+
if indexes.size == 1
|
|
33
|
+
extract_value(capture, parameters, assigns)
|
|
34
|
+
# sigil was found, need to call getAttr
|
|
35
|
+
elsif indexes.size == 2
|
|
36
|
+
ref, property = indexes
|
|
37
|
+
param = extract_value(ref, parameters, assigns)
|
|
38
|
+
Matchers.attr(param, property)
|
|
39
|
+
else
|
|
40
|
+
raise "Invalid templatable value: #{capture}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Checks both parameters and assigns hash for the referenced value
|
|
45
|
+
def extract_value(key, parameters, assigns)
|
|
46
|
+
if assigns.key?(key)
|
|
47
|
+
assigns[key]
|
|
48
|
+
elsif parameters.class.singleton_class::PARAM_MAP.key?(key)
|
|
49
|
+
member_name = parameters.class.singleton_class::PARAM_MAP[key]
|
|
50
|
+
parameters[member_name]
|
|
51
|
+
else
|
|
52
|
+
raise "Templatable value not found: #{key}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class TreeRule
|
|
12
|
+
def initialize(type: 'tree', conditions:, rules:, documentation: nil)
|
|
13
|
+
@type = type
|
|
14
|
+
@conditions = Condition.from_json(conditions)
|
|
15
|
+
@rules = RuleSet.rules_from_json(rules)
|
|
16
|
+
@documentation = documentation
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :type
|
|
20
|
+
attr_reader :conditions
|
|
21
|
+
attr_reader :error
|
|
22
|
+
attr_reader :documentation
|
|
23
|
+
|
|
24
|
+
def match(parameters, assigned = {})
|
|
25
|
+
assigns = assigned.dup
|
|
26
|
+
matched = conditions.all? do |condition|
|
|
27
|
+
output = condition.match?(parameters, assigns)
|
|
28
|
+
assigns = assigns.merge(condition.assigned) if condition.assign
|
|
29
|
+
output
|
|
30
|
+
end
|
|
31
|
+
resolve_rules(parameters, assigns) if matched
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def resolve_rules(parameters, assigns)
|
|
37
|
+
@rules.each do |rule|
|
|
38
|
+
output = rule.match(parameters, assigns)
|
|
39
|
+
return output if output
|
|
40
|
+
end
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ipaddr'
|
|
4
|
+
|
|
5
|
+
module Aws
|
|
6
|
+
module Endpoints
|
|
7
|
+
|
|
8
|
+
# @api private
|
|
9
|
+
class URL
|
|
10
|
+
def initialize(url)
|
|
11
|
+
uri = URI(url)
|
|
12
|
+
@scheme = uri.scheme
|
|
13
|
+
# only support http and https schemes
|
|
14
|
+
raise ArgumentError unless %w[https http].include?(@scheme)
|
|
15
|
+
|
|
16
|
+
# do not support query
|
|
17
|
+
raise ArgumentError if uri.query
|
|
18
|
+
|
|
19
|
+
@authority = _authority(url, uri)
|
|
20
|
+
@path = uri.path
|
|
21
|
+
@normalized_path = uri.path + (uri.path[-1] == '/' ? '' : '/')
|
|
22
|
+
@is_ip = _is_ip(uri.host)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attr_reader :scheme
|
|
26
|
+
attr_reader :authority
|
|
27
|
+
attr_reader :path
|
|
28
|
+
attr_reader :normalized_path
|
|
29
|
+
attr_reader :is_ip
|
|
30
|
+
|
|
31
|
+
def as_json(_options = {})
|
|
32
|
+
{
|
|
33
|
+
'scheme' => scheme,
|
|
34
|
+
'authority' => authority,
|
|
35
|
+
'path' => path,
|
|
36
|
+
'normalizedPath' => normalized_path,
|
|
37
|
+
'isIp' => is_ip
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def _authority(url, uri)
|
|
44
|
+
# don't include port if it's default and not parsed originally
|
|
45
|
+
if uri.default_port == uri.port && !url.include?(":#{uri.port}")
|
|
46
|
+
uri.host
|
|
47
|
+
else
|
|
48
|
+
"#{uri.host}:#{uri.port}"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def _is_ip(authority)
|
|
53
|
+
IPAddr.new(authority)
|
|
54
|
+
true
|
|
55
|
+
rescue IPAddr::InvalidAddressError
|
|
56
|
+
false
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'endpoints/rule'
|
|
4
|
+
require_relative 'endpoints/condition'
|
|
5
|
+
require_relative 'endpoints/endpoint_rule'
|
|
6
|
+
require_relative 'endpoints/endpoint'
|
|
7
|
+
require_relative 'endpoints/error_rule'
|
|
8
|
+
require_relative 'endpoints/function'
|
|
9
|
+
require_relative 'endpoints/matchers'
|
|
10
|
+
require_relative 'endpoints/reference'
|
|
11
|
+
require_relative 'endpoints/rules_provider'
|
|
12
|
+
require_relative 'endpoints/rule_set'
|
|
13
|
+
require_relative 'endpoints/templater'
|
|
14
|
+
require_relative 'endpoints/tree_rule'
|
|
15
|
+
require_relative 'endpoints/url'
|
|
16
|
+
|
|
17
|
+
require 'aws-sigv4'
|
|
18
|
+
|
|
19
|
+
module Aws
|
|
20
|
+
# @api private
|
|
21
|
+
module Endpoints
|
|
22
|
+
# Maps config auth scheme preferences to endpoint auth scheme names.
|
|
23
|
+
ENDPOINT_AUTH_PREFERENCE_MAP = {
|
|
24
|
+
'sigv4' => %w[sigv4 sigv4-s3express],
|
|
25
|
+
'sigv4a' => ['sigv4a'],
|
|
26
|
+
'httpBearerAuth' => ['bearer'],
|
|
27
|
+
'noAuth' => ['none']
|
|
28
|
+
}.freeze
|
|
29
|
+
SUPPORTED_ENDPOINT_AUTH = ENDPOINT_AUTH_PREFERENCE_MAP.values.flatten.freeze
|
|
30
|
+
|
|
31
|
+
# Maps configured auth scheme preferences to modeled auth traits.
|
|
32
|
+
MODELED_AUTH_PREFERENCE_MAP = {
|
|
33
|
+
'sigv4' => 'aws.auth#sigv4',
|
|
34
|
+
'sigv4a' => 'aws.auth#sigv4a',
|
|
35
|
+
'httpBearerAuth' => 'smithy.api#httpBearerAuth',
|
|
36
|
+
'noAuth' => 'smithy.api#noAuth'
|
|
37
|
+
}.freeze
|
|
38
|
+
SUPPORTED_MODELED_AUTH = MODELED_AUTH_PREFERENCE_MAP.values.freeze
|
|
39
|
+
|
|
40
|
+
class << self
|
|
41
|
+
def resolve_auth_scheme(context, endpoint)
|
|
42
|
+
if endpoint && (auth_schemes = endpoint.properties['authSchemes'])
|
|
43
|
+
auth_scheme = endpoint_auth_scheme_preference(auth_schemes, context.config.auth_scheme_preference)
|
|
44
|
+
raise 'No supported auth scheme for this endpoint.' unless auth_scheme
|
|
45
|
+
|
|
46
|
+
merge_signing_defaults(auth_scheme, context.config)
|
|
47
|
+
else
|
|
48
|
+
default_auth_scheme(context)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def endpoint_auth_scheme_preference(auth_schemes, preferred_auth)
|
|
55
|
+
ordered_auth = preferred_auth.each_with_object([]) do |pref, list|
|
|
56
|
+
next unless ENDPOINT_AUTH_PREFERENCE_MAP.key?(pref)
|
|
57
|
+
|
|
58
|
+
ENDPOINT_AUTH_PREFERENCE_MAP[pref].each { |name| list << { 'name' => name } }
|
|
59
|
+
end
|
|
60
|
+
ordered_auth += auth_schemes
|
|
61
|
+
ordered_auth.find { |auth| SUPPORTED_ENDPOINT_AUTH.include?(auth['name']) }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def merge_signing_defaults(auth_scheme, config)
|
|
65
|
+
if %w[sigv4 sigv4a sigv4-s3express].include?(auth_scheme['name'])
|
|
66
|
+
auth_scheme['signingName'] ||= sigv4_name(config)
|
|
67
|
+
|
|
68
|
+
# back fill disableNormalizePath for S3 until it gets correctly set in the rules
|
|
69
|
+
if auth_scheme['signingName'] == 's3' &&
|
|
70
|
+
!auth_scheme.include?('disableNormalizePath') &&
|
|
71
|
+
auth_scheme.include?('disableDoubleEncoding')
|
|
72
|
+
auth_scheme['disableNormalizePath'] = auth_scheme['disableDoubleEncoding']
|
|
73
|
+
end
|
|
74
|
+
if auth_scheme['name'] == 'sigv4a'
|
|
75
|
+
# config option supersedes endpoint properties
|
|
76
|
+
auth_scheme['signingRegionSet'] =
|
|
77
|
+
config.sigv4a_signing_region_set || auth_scheme['signingRegionSet'] || [config.region]
|
|
78
|
+
else
|
|
79
|
+
auth_scheme['signingRegion'] ||= config.region
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
auth_scheme
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def sigv4_name(config)
|
|
86
|
+
config.api.metadata['signingName'] || config.api.metadata['endpointPrefix']
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def default_auth_scheme(context)
|
|
90
|
+
if (modeled_auth = default_api_auth(context))
|
|
91
|
+
auth = modeled_auth_scheme_preference(modeled_auth, context.config.auth_scheme_preference)
|
|
92
|
+
case auth
|
|
93
|
+
when 'aws.auth#sigv4', 'aws.auth#sigv4a'
|
|
94
|
+
auth_scheme = { 'name' => auth.split('#').last }
|
|
95
|
+
if s3_or_s3v4_signature_version?(context)
|
|
96
|
+
auth_scheme = auth_scheme.merge(
|
|
97
|
+
'disableDoubleEncoding' => true,
|
|
98
|
+
'disableNormalizePath' => true
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
merge_signing_defaults(auth_scheme, context.config)
|
|
102
|
+
when 'smithy.api#httpBearerAuth'
|
|
103
|
+
{ 'name' => 'bearer' }
|
|
104
|
+
when 'smithy.api#noAuth'
|
|
105
|
+
{ 'name' => 'none' }
|
|
106
|
+
else
|
|
107
|
+
raise 'No supported auth trait for this endpoint.'
|
|
108
|
+
end
|
|
109
|
+
else
|
|
110
|
+
legacy_default_auth_scheme(context)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def modeled_auth_scheme_preference(modeled_auth, preferred_auth)
|
|
115
|
+
ordered_auth = preferred_auth.map { |pref| MODELED_AUTH_PREFERENCE_MAP[pref] }.compact
|
|
116
|
+
ordered_auth += modeled_auth
|
|
117
|
+
ordered_auth.find { |auth| SUPPORTED_MODELED_AUTH.include?(auth) }
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def default_api_auth(context)
|
|
121
|
+
context.config.api.operation(context.operation_name)['auth'] ||
|
|
122
|
+
context.config.api.metadata['auth']
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def s3_or_s3v4_signature_version?(context)
|
|
126
|
+
%w[s3 s3v4].include?(context.config.api.metadata['signatureVersion'])
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Legacy auth resolution - looks for deprecated signatureVersion
|
|
130
|
+
# and authType traits.
|
|
131
|
+
|
|
132
|
+
def legacy_default_auth_scheme(context)
|
|
133
|
+
case legacy_default_api_authtype(context)
|
|
134
|
+
when 'v4', 'v4-unsigned-body'
|
|
135
|
+
auth_scheme = { 'name' => 'sigv4' }
|
|
136
|
+
merge_signing_defaults(auth_scheme, context.config)
|
|
137
|
+
when 's3', 's3v4'
|
|
138
|
+
auth_scheme = {
|
|
139
|
+
'name' => 'sigv4',
|
|
140
|
+
'disableDoubleEncoding' => true,
|
|
141
|
+
'disableNormalizePath' => true
|
|
142
|
+
}
|
|
143
|
+
merge_signing_defaults(auth_scheme, context.config)
|
|
144
|
+
when 'bearer'
|
|
145
|
+
{ 'name' => 'bearer' }
|
|
146
|
+
when 'none', nil
|
|
147
|
+
{ 'name' => 'none' }
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def legacy_default_api_authtype(context)
|
|
152
|
+
context.config.api.operation(context.operation_name)['authtype'] ||
|
|
153
|
+
context.config.api.metadata['signatureVersion']
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
# @api private
|
|
5
|
+
class ErrorHandler < Seahorse::Client::Handler
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
def error(context)
|
|
10
|
+
body = context.http_response.body_contents
|
|
11
|
+
# This is not correct per protocol tests. Some headers will determine the error code.
|
|
12
|
+
# If the body is empty, there is still potentially an error code from the header, but
|
|
13
|
+
# we are making a generic http status error instead. In a new major version, we should
|
|
14
|
+
# always try to extract header, and during extraction, check headers and body.
|
|
15
|
+
if body.empty?
|
|
16
|
+
code, message, data = http_status_error(context)
|
|
17
|
+
else
|
|
18
|
+
code, message, data = extract_error(body, context)
|
|
19
|
+
end
|
|
20
|
+
build_error(context, code, message, data)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def build_error(context, code, message, data)
|
|
24
|
+
errors_module = context.client.class.errors_module
|
|
25
|
+
errors_module.error_class(code).new(context, message, data)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def http_status_error(context)
|
|
29
|
+
[http_status_error_code(context), '', EmptyStructure.new]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def http_status_error_code(context)
|
|
33
|
+
status_code = context.http_response.status_code
|
|
34
|
+
{
|
|
35
|
+
302 => 'MovedTemporarily',
|
|
36
|
+
304 => 'NotModified',
|
|
37
|
+
400 => 'BadRequest',
|
|
38
|
+
403 => 'Forbidden',
|
|
39
|
+
404 => 'NotFound',
|
|
40
|
+
412 => 'PreconditionFailed',
|
|
41
|
+
413 => 'RequestEntityTooLarge',
|
|
42
|
+
}[status_code] || "Http#{status_code}Error"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|