aws-sdk-core 3.121.1 → 3.174.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +491 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-defaults/default_configuration.rb +153 -0
  5. data/lib/aws-defaults/defaults_mode_config_resolver.rb +107 -0
  6. data/lib/aws-defaults.rb +3 -0
  7. data/lib/aws-sdk-core/arn.rb +13 -0
  8. data/lib/aws-sdk-core/assume_role_credentials.rb +21 -7
  9. data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +14 -10
  10. data/lib/aws-sdk-core/binary/encode_handler.rb +12 -1
  11. data/lib/aws-sdk-core/client_stubs.rb +5 -1
  12. data/lib/aws-sdk-core/credential_provider_chain.rb +8 -5
  13. data/lib/aws-sdk-core/ec2_metadata.rb +3 -2
  14. data/lib/aws-sdk-core/ecs_credentials.rb +121 -53
  15. data/lib/aws-sdk-core/endpoints/condition.rb +41 -0
  16. data/lib/aws-sdk-core/endpoints/endpoint.rb +17 -0
  17. data/lib/aws-sdk-core/endpoints/endpoint_rule.rb +75 -0
  18. data/lib/aws-sdk-core/endpoints/error_rule.rb +42 -0
  19. data/lib/aws-sdk-core/endpoints/function.rb +80 -0
  20. data/lib/aws-sdk-core/endpoints/matchers.rb +127 -0
  21. data/lib/aws-sdk-core/endpoints/reference.rb +31 -0
  22. data/lib/aws-sdk-core/endpoints/rule.rb +25 -0
  23. data/lib/aws-sdk-core/endpoints/rule_set.rb +52 -0
  24. data/lib/aws-sdk-core/endpoints/rules_provider.rb +37 -0
  25. data/lib/aws-sdk-core/endpoints/templater.rb +58 -0
  26. data/lib/aws-sdk-core/endpoints/tree_rule.rb +45 -0
  27. data/lib/aws-sdk-core/endpoints/url.rb +60 -0
  28. data/lib/aws-sdk-core/endpoints.rb +74 -0
  29. data/lib/aws-sdk-core/errors.rb +14 -1
  30. data/lib/aws-sdk-core/instance_profile_credentials.rb +85 -14
  31. data/lib/aws-sdk-core/json/error_handler.rb +20 -1
  32. data/lib/aws-sdk-core/log/formatter.rb +6 -0
  33. data/lib/aws-sdk-core/pageable_response.rb +81 -32
  34. data/lib/aws-sdk-core/plugins/bearer_authorization.rb +67 -0
  35. data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +340 -0
  36. data/lib/aws-sdk-core/plugins/credentials_configuration.rb +27 -1
  37. data/lib/aws-sdk-core/plugins/defaults_mode.rb +40 -0
  38. data/lib/aws-sdk-core/plugins/endpoint_discovery.rb +6 -2
  39. data/lib/aws-sdk-core/plugins/http_checksum.rb +8 -1
  40. data/lib/aws-sdk-core/plugins/jsonvalue_converter.rb +34 -6
  41. data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +17 -0
  42. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +16 -1
  43. data/lib/aws-sdk-core/plugins/recursion_detection.rb +38 -0
  44. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +52 -1
  45. data/lib/aws-sdk-core/plugins/response_paging.rb +1 -1
  46. data/lib/aws-sdk-core/plugins/retries/error_inspector.rb +7 -4
  47. data/lib/aws-sdk-core/plugins/retry_errors.rb +21 -5
  48. data/lib/aws-sdk-core/plugins/sign.rb +200 -0
  49. data/lib/aws-sdk-core/plugins/signature_v2.rb +1 -0
  50. data/lib/aws-sdk-core/plugins/signature_v4.rb +28 -31
  51. data/lib/aws-sdk-core/plugins/stub_responses.rb +5 -1
  52. data/lib/aws-sdk-core/plugins/user_agent.rb +117 -14
  53. data/lib/aws-sdk-core/process_credentials.rb +9 -11
  54. data/lib/aws-sdk-core/refreshing_credentials.rb +42 -11
  55. data/lib/aws-sdk-core/refreshing_token.rb +71 -0
  56. data/lib/aws-sdk-core/rest/handler.rb +1 -1
  57. data/lib/aws-sdk-core/rest/request/body.rb +19 -1
  58. data/lib/aws-sdk-core/rest/request/headers.rb +14 -6
  59. data/lib/aws-sdk-core/rest/response/headers.rb +3 -1
  60. data/lib/aws-sdk-core/shared_config.rb +82 -12
  61. data/lib/aws-sdk-core/sso_credentials.rb +91 -50
  62. data/lib/aws-sdk-core/sso_token_provider.rb +135 -0
  63. data/lib/aws-sdk-core/static_token_provider.rb +14 -0
  64. data/lib/aws-sdk-core/structure.rb +6 -4
  65. data/lib/aws-sdk-core/token.rb +31 -0
  66. data/lib/aws-sdk-core/token_provider.rb +15 -0
  67. data/lib/aws-sdk-core/token_provider_chain.rb +51 -0
  68. data/lib/aws-sdk-core/waiters/poller.rb +3 -1
  69. data/lib/aws-sdk-core/xml/error_handler.rb +7 -0
  70. data/lib/aws-sdk-core/xml/parser/engines/oga.rb +2 -0
  71. data/lib/aws-sdk-core/xml/parser/engines/ox.rb +1 -1
  72. data/lib/aws-sdk-core.rb +20 -0
  73. data/lib/aws-sdk-sso/client.rb +82 -15
  74. data/lib/aws-sdk-sso/endpoint_parameters.rb +66 -0
  75. data/lib/aws-sdk-sso/endpoint_provider.rb +51 -0
  76. data/lib/aws-sdk-sso/endpoints.rb +71 -0
  77. data/lib/aws-sdk-sso/plugins/endpoints.rb +76 -0
  78. data/lib/aws-sdk-sso/types.rb +8 -43
  79. data/lib/aws-sdk-sso.rb +5 -1
  80. data/lib/aws-sdk-ssooidc/client.rb +611 -0
  81. data/lib/aws-sdk-ssooidc/client_api.rb +216 -0
  82. data/lib/aws-sdk-ssooidc/customizations.rb +1 -0
  83. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +66 -0
  84. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +51 -0
  85. data/lib/aws-sdk-ssooidc/endpoints.rb +57 -0
  86. data/lib/aws-sdk-ssooidc/errors.rb +290 -0
  87. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +74 -0
  88. data/lib/aws-sdk-ssooidc/resource.rb +26 -0
  89. data/lib/aws-sdk-ssooidc/types.rb +502 -0
  90. data/lib/aws-sdk-ssooidc.rb +59 -0
  91. data/lib/aws-sdk-sts/client.rb +377 -361
  92. data/lib/aws-sdk-sts/endpoint_parameters.rb +78 -0
  93. data/lib/aws-sdk-sts/endpoint_provider.rb +112 -0
  94. data/lib/aws-sdk-sts/endpoints.rb +135 -0
  95. data/lib/aws-sdk-sts/plugins/endpoints.rb +84 -0
  96. data/lib/aws-sdk-sts/plugins/sts_regional_endpoints.rb +5 -1
  97. data/lib/aws-sdk-sts/presigner.rb +13 -9
  98. data/lib/aws-sdk-sts/types.rb +127 -225
  99. data/lib/aws-sdk-sts.rb +5 -1
  100. data/lib/seahorse/client/async_base.rb +0 -1
  101. data/lib/seahorse/client/configuration.rb +6 -2
  102. data/lib/seahorse/client/h2/connection.rb +12 -11
  103. data/lib/seahorse/client/net_http/connection_pool.rb +7 -0
  104. data/lib/seahorse/client/net_http/handler.rb +15 -7
  105. data/lib/seahorse/client/net_http/patches.rb +16 -0
  106. data/lib/seahorse/client/plugins/content_length.rb +11 -5
  107. data/lib/seahorse/client/plugins/net_http.rb +33 -2
  108. data/lib/seahorse/client/plugins/request_callback.rb +9 -9
  109. data/lib/seahorse/model/operation.rb +3 -0
  110. data/lib/seahorse/util.rb +4 -0
  111. metadata +61 -9
  112. data/lib/aws-sdk-sso/plugins/content_type.rb +0 -25
@@ -0,0 +1,75 @@
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. # @api private
10
+ class EndpointRule < Rule
11
+ def initialize(type: 'endpoint', conditions:, endpoint:,
12
+ documentation: nil)
13
+ @type = type
14
+ @conditions = Condition.from_json(conditions)
15
+ @endpoint = endpoint
16
+ @documentation = documentation
17
+ end
18
+
19
+ attr_reader :type
20
+ attr_reader :conditions
21
+ attr_reader :endpoint
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
+ resolved_endpoint(parameters, assigns) if matched
32
+ end
33
+
34
+ def resolved_endpoint(parameters, assigns)
35
+ Endpoint.new(
36
+ url: resolve_value(@endpoint['url'], parameters, assigns),
37
+ properties: resolve_properties(
38
+ @endpoint['properties'] || {},
39
+ parameters,
40
+ assigns
41
+ ),
42
+ headers: resolve_headers(parameters, assigns)
43
+ )
44
+ end
45
+
46
+ private
47
+
48
+ def resolve_headers(parameters, assigns)
49
+ (@endpoint['headers'] || {}).each.with_object({}) do |(key, arr), headers|
50
+ headers[key] = []
51
+ arr.each do |value|
52
+ headers[key] << resolve_value(value, parameters, assigns)
53
+ end
54
+ end
55
+ end
56
+
57
+ def resolve_properties(obj, parameters, assigns)
58
+ case obj
59
+ when Hash
60
+ obj.each.with_object({}) do |(key, value), hash|
61
+ hash[key] = resolve_properties(value, parameters, assigns)
62
+ end
63
+ when Array
64
+ obj.collect { |value| resolve_properties(value, parameters, assigns) }
65
+ else
66
+ if obj.is_a?(String)
67
+ Templater.resolve(obj, parameters, assigns)
68
+ else
69
+ obj
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,42 @@
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 ErrorRule < Rule
12
+ def initialize(type: 'error', conditions:, error: nil, documentation: nil)
13
+ @type = type
14
+ @conditions = Condition.from_json(conditions)
15
+ @error = error
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
+ resolved_error(parameters, assigns) if matched
32
+ end
33
+
34
+ private
35
+
36
+ def resolved_error(parameters, assigns)
37
+ error = resolve_value(@error, parameters, assigns)
38
+ ArgumentError.new(error)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,80 @@
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 Function
12
+ def initialize(fn:, argv:)
13
+ @fn = fn
14
+ @argv = build_argv(argv)
15
+ end
16
+
17
+ attr_reader :fn
18
+ attr_reader :argv
19
+
20
+ def call(parameters, assigns)
21
+ args = []
22
+ @argv.each do |arg|
23
+ if arg.is_a?(Reference)
24
+ args << arg.resolve(parameters, assigns)
25
+ elsif arg.is_a?(Function)
26
+ args << arg.call(parameters, assigns)
27
+ else
28
+ if arg.is_a?(String)
29
+ arg = Templater.resolve(arg, parameters, assigns)
30
+ end
31
+ args << arg
32
+ end
33
+ end
34
+
35
+ case @fn
36
+ when 'isSet'
37
+ Matchers.set?(*args)
38
+ when 'not'
39
+ Matchers.not(*args)
40
+ when 'getAttr'
41
+ Matchers.attr(*args)
42
+ when 'substring'
43
+ Matchers.substring(*args)
44
+ when 'stringEquals'
45
+ Matchers.string_equals?(*args)
46
+ when 'booleanEquals'
47
+ Matchers.boolean_equals?(*args)
48
+ when 'uriEncode'
49
+ Matchers.uri_encode(*args)
50
+ when 'parseURL'
51
+ Matchers.parse_url(*args)
52
+ when 'isValidHostLabel'
53
+ Matchers.valid_host_label?(*args)
54
+ when 'aws.partition'
55
+ Matchers.aws_partition(*args)
56
+ when 'aws.parseArn'
57
+ Matchers.aws_parse_arn(*args)
58
+ when 'aws.isVirtualHostableS3Bucket'
59
+ Matchers.aws_virtual_hostable_s3_bucket?(*args)
60
+ else
61
+ raise "Function not found: #{@fn}"
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def build_argv(argv_json)
68
+ argv_json.each.with_object([]) do |arg, argv|
69
+ argv << if arg.is_a?(Hash) && arg['ref']
70
+ Reference.new(ref: arg['ref'])
71
+ elsif arg.is_a?(Hash) && arg['fn']
72
+ Function.new(fn: arg['fn'], argv: arg['argv'])
73
+ else
74
+ arg
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+
5
+ module Aws
6
+ module Endpoints
7
+ # generic matcher functions for service endpoints
8
+ # @api private
9
+ module Matchers
10
+ # Regex that extracts anything in square brackets
11
+ BRACKET_REGEX = /\[(.*?)\]/.freeze
12
+
13
+ # CORE
14
+
15
+ # isSet(value: Option<T>) bool
16
+ def self.set?(value)
17
+ !value.nil?
18
+ end
19
+
20
+ # not(value: bool) bool
21
+ def self.not(bool)
22
+ !bool
23
+ end
24
+
25
+ # getAttr(value: Object | Array, path: string) Document
26
+ def self.attr(value, path)
27
+ parts = path.split('.')
28
+
29
+ val = if (index = parts.first[BRACKET_REGEX, 1])
30
+ # remove brackets and index from part before indexing
31
+ value[parts.first.gsub(BRACKET_REGEX, '')][index.to_i]
32
+ else
33
+ value[parts.first]
34
+ end
35
+
36
+ if parts.size == 1
37
+ val
38
+ else
39
+ attr(val, parts.slice(1..-1).join('.'))
40
+ end
41
+ end
42
+
43
+ def self.substring(input, start, stop, reverse)
44
+ return nil if start >= stop || input.size < stop
45
+
46
+ return nil if input.chars.any? { |c| c.ord > 127 }
47
+
48
+ return input[start...stop] unless reverse
49
+
50
+ r_start = input.size - stop
51
+ r_stop = input.size - start
52
+ input[r_start...r_stop]
53
+ end
54
+
55
+ # stringEquals(value1: string, value2: string) bool
56
+ def self.string_equals?(value1, value2)
57
+ value1 == value2
58
+ end
59
+
60
+ # booleanEquals(value1: bool, value2: bool) bool
61
+ def self.boolean_equals?(value1, value2)
62
+ value1 == value2
63
+ end
64
+
65
+ # uriEncode(value: string) string
66
+ def self.uri_encode(value)
67
+ CGI.escape(value.encode('UTF-8')).gsub('+', '%20').gsub('%7E', '~')
68
+ end
69
+
70
+ # parseUrl(value: string) Option<URL>
71
+ def self.parse_url(value)
72
+ URL.new(value).as_json
73
+ rescue ArgumentError, URI::InvalidURIError
74
+ nil
75
+ end
76
+
77
+ # isValidHostLabel(value: string, allowSubDomains: bool) bool
78
+ def self.valid_host_label?(value, allow_sub_domains = false)
79
+ return false if value.empty?
80
+
81
+ if allow_sub_domains
82
+ labels = value.split('.')
83
+ return labels.all? { |l| valid_host_label?(l) }
84
+ end
85
+
86
+ value =~ /\A(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\z/
87
+ end
88
+
89
+ # AWS
90
+
91
+ # aws.partition(value: string) Option<Partition>
92
+ def self.aws_partition(value)
93
+ partition =
94
+ Aws::Partitions.find { |p| p.region?(value) } ||
95
+ Aws::Partitions.find { |p| value.match(p.region_regex) } ||
96
+ Aws::Partitions.find { |p| p.name == 'aws' }
97
+
98
+ return nil unless partition
99
+
100
+ partition.metadata
101
+ end
102
+
103
+ # aws.parseArn(value: string) Option<ARN>
104
+ def self.aws_parse_arn(value)
105
+ arn = Aws::ARNParser.parse(value)
106
+ json = arn.as_json
107
+ # HACK: because of poor naming and also requirement of splitting
108
+ resource = json.delete('resource')
109
+ json['resourceId'] = resource.split(%r{[:\/]}, -1)
110
+ json
111
+ rescue Aws::Errors::InvalidARNError
112
+ nil
113
+ end
114
+
115
+ # aws.isVirtualHostableS3Bucket(value: string, allowSubDomains: bool) bool
116
+ def self.aws_virtual_hostable_s3_bucket?(value, allow_sub_domains = false)
117
+ !!(value.size < 64 &&
118
+ # regular naming rules
119
+ value =~ /^[a-z0-9][a-z0-9\-#{'.' if allow_sub_domains}]+[a-z0-9]$/ &&
120
+ # not IP address
121
+ value !~ /(\d+\.){3}\d+/ &&
122
+ # no dash and hyphen together
123
+ value !~ /[.-]{2}/)
124
+ end
125
+ end
126
+ end
127
+ 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