aws-sdk-core 3.186.0 → 3.241.3

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.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +715 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-defaults.rb +4 -1
  5. data/lib/aws-sdk-core/arn.rb +1 -3
  6. data/lib/aws-sdk-core/assume_role_credentials.rb +21 -13
  7. data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +16 -9
  8. data/lib/aws-sdk-core/binary/decode_handler.rb +3 -9
  9. data/lib/aws-sdk-core/binary/encode_handler.rb +1 -1
  10. data/lib/aws-sdk-core/binary/event_builder.rb +34 -37
  11. data/lib/aws-sdk-core/binary/event_stream_decoder.rb +1 -0
  12. data/lib/aws-sdk-core/binary/event_stream_encoder.rb +4 -3
  13. data/lib/aws-sdk-core/cbor/decoder.rb +308 -0
  14. data/lib/aws-sdk-core/cbor/encoder.rb +243 -0
  15. data/lib/aws-sdk-core/cbor.rb +53 -0
  16. data/lib/aws-sdk-core/client_side_monitoring.rb +9 -0
  17. data/lib/aws-sdk-core/client_stubs.rb +39 -55
  18. data/lib/aws-sdk-core/credential_provider.rb +5 -1
  19. data/lib/aws-sdk-core/credential_provider_chain.rb +101 -25
  20. data/lib/aws-sdk-core/credentials.rb +19 -6
  21. data/lib/aws-sdk-core/ec2_metadata.rb +1 -1
  22. data/lib/aws-sdk-core/ecs_credentials.rb +92 -24
  23. data/lib/aws-sdk-core/endpoints/endpoint.rb +3 -1
  24. data/lib/aws-sdk-core/endpoints/matchers.rb +8 -10
  25. data/lib/aws-sdk-core/endpoints.rb +101 -21
  26. data/lib/aws-sdk-core/error_handler.rb +46 -0
  27. data/lib/aws-sdk-core/errors.rb +16 -4
  28. data/lib/aws-sdk-core/event_emitter.rb +1 -17
  29. data/lib/aws-sdk-core/instance_profile_credentials.rb +148 -157
  30. data/lib/aws-sdk-core/json/builder.rb +8 -1
  31. data/lib/aws-sdk-core/json/error_handler.rb +29 -13
  32. data/lib/aws-sdk-core/json/handler.rb +13 -6
  33. data/lib/aws-sdk-core/json/json_engine.rb +3 -1
  34. data/lib/aws-sdk-core/json/oj_engine.rb +7 -1
  35. data/lib/aws-sdk-core/json/parser.rb +32 -2
  36. data/lib/aws-sdk-core/json.rb +43 -14
  37. data/lib/aws-sdk-core/log/param_filter.rb +2 -2
  38. data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
  39. data/lib/aws-sdk-core/log.rb +10 -0
  40. data/lib/aws-sdk-core/login_credentials.rb +229 -0
  41. data/lib/aws-sdk-core/lru_cache.rb +75 -0
  42. data/lib/aws-sdk-core/pageable_response.rb +1 -1
  43. data/lib/aws-sdk-core/param_validator.rb +7 -2
  44. data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
  45. data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +436 -201
  46. data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
  47. data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
  48. data/lib/aws-sdk-core/plugins/credentials_configuration.rb +78 -56
  49. data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
  50. data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
  51. data/lib/aws-sdk-core/plugins/http_checksum.rb +3 -8
  52. data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
  53. data/lib/aws-sdk-core/plugins/logging.rb +2 -0
  54. data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
  55. data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
  56. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
  57. data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
  58. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +3 -15
  59. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
  60. data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
  61. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +74 -25
  62. data/lib/aws-sdk-core/plugins/request_compression.rb +11 -2
  63. data/lib/aws-sdk-core/plugins/retries/clock_skew.rb +28 -16
  64. data/lib/aws-sdk-core/plugins/retry_errors.rb +12 -3
  65. data/lib/aws-sdk-core/plugins/sign.rb +55 -34
  66. data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -1
  67. data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -1
  68. data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
  69. data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
  70. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
  71. data/lib/aws-sdk-core/plugins/user_agent.rb +103 -26
  72. data/lib/aws-sdk-core/plugins.rb +39 -0
  73. data/lib/aws-sdk-core/process_credentials.rb +48 -29
  74. data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
  75. data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
  76. data/lib/aws-sdk-core/query/handler.rb +4 -4
  77. data/lib/aws-sdk-core/query/param_builder.rb +2 -2
  78. data/lib/aws-sdk-core/query.rb +2 -1
  79. data/lib/aws-sdk-core/refreshing_credentials.rb +20 -17
  80. data/lib/aws-sdk-core/resources.rb +8 -0
  81. data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
  82. data/lib/aws-sdk-core/rest/handler.rb +3 -4
  83. data/lib/aws-sdk-core/rest/request/body.rb +32 -5
  84. data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
  85. data/lib/aws-sdk-core/rest/request/headers.rb +15 -7
  86. data/lib/aws-sdk-core/rest/request/querystring_builder.rb +23 -11
  87. data/lib/aws-sdk-core/rest/response/body.rb +15 -1
  88. data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
  89. data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
  90. data/lib/aws-sdk-core/rest.rb +1 -0
  91. data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
  92. data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
  93. data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
  94. data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
  95. data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
  96. data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
  97. data/lib/aws-sdk-core/rpc_v2.rb +69 -0
  98. data/lib/aws-sdk-core/shared_config.rb +109 -22
  99. data/lib/aws-sdk-core/shared_credentials.rb +1 -7
  100. data/lib/aws-sdk-core/sso_credentials.rb +5 -2
  101. data/lib/aws-sdk-core/static_token_provider.rb +1 -2
  102. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
  103. data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
  104. data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
  105. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
  106. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
  107. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
  108. data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
  109. data/lib/aws-sdk-core/stubbing.rb +22 -0
  110. data/lib/aws-sdk-core/telemetry/base.rb +177 -0
  111. data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
  112. data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
  113. data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
  114. data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
  115. data/lib/aws-sdk-core/telemetry.rb +78 -0
  116. data/lib/aws-sdk-core/token.rb +3 -3
  117. data/lib/aws-sdk-core/token_provider.rb +4 -0
  118. data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
  119. data/lib/aws-sdk-core/util.rb +41 -1
  120. data/lib/aws-sdk-core/waiters/poller.rb +10 -5
  121. data/lib/aws-sdk-core/xml/builder.rb +17 -9
  122. data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
  123. data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
  124. data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
  125. data/lib/aws-sdk-core/xml/parser.rb +2 -6
  126. data/lib/aws-sdk-core.rb +86 -107
  127. data/lib/aws-sdk-signin/client.rb +604 -0
  128. data/lib/aws-sdk-signin/client_api.rb +119 -0
  129. data/lib/aws-sdk-signin/customizations.rb +1 -0
  130. data/lib/aws-sdk-signin/endpoint_parameters.rb +69 -0
  131. data/lib/aws-sdk-signin/endpoint_provider.rb +59 -0
  132. data/lib/aws-sdk-signin/endpoints.rb +20 -0
  133. data/lib/aws-sdk-signin/errors.rb +122 -0
  134. data/lib/aws-sdk-signin/plugins/endpoints.rb +77 -0
  135. data/lib/aws-sdk-signin/resource.rb +26 -0
  136. data/lib/aws-sdk-signin/types.rb +299 -0
  137. data/lib/aws-sdk-signin.rb +63 -0
  138. data/lib/aws-sdk-sso/client.rb +189 -96
  139. data/lib/aws-sdk-sso/client_api.rb +7 -0
  140. data/lib/aws-sdk-sso/endpoint_parameters.rb +13 -10
  141. data/lib/aws-sdk-sso/endpoint_provider.rb +16 -20
  142. data/lib/aws-sdk-sso/endpoints.rb +2 -54
  143. data/lib/aws-sdk-sso/plugins/endpoints.rb +23 -22
  144. data/lib/aws-sdk-sso/types.rb +1 -0
  145. data/lib/aws-sdk-sso.rb +15 -11
  146. data/lib/aws-sdk-ssooidc/client.rb +609 -129
  147. data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
  148. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +13 -10
  149. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +16 -20
  150. data/lib/aws-sdk-ssooidc/endpoints.rb +2 -40
  151. data/lib/aws-sdk-ssooidc/errors.rb +62 -0
  152. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +23 -20
  153. data/lib/aws-sdk-ssooidc/types.rb +419 -53
  154. data/lib/aws-sdk-ssooidc.rb +15 -11
  155. data/lib/aws-sdk-sts/client.rb +537 -156
  156. data/lib/aws-sdk-sts/client_api.rb +108 -8
  157. data/lib/aws-sdk-sts/customizations.rb +5 -2
  158. data/lib/aws-sdk-sts/endpoint_parameters.rb +15 -14
  159. data/lib/aws-sdk-sts/endpoint_provider.rb +52 -57
  160. data/lib/aws-sdk-sts/endpoints.rb +2 -118
  161. data/lib/aws-sdk-sts/errors.rb +79 -0
  162. data/lib/aws-sdk-sts/plugins/endpoints.rb +23 -30
  163. data/lib/aws-sdk-sts/presigner.rb +3 -7
  164. data/lib/aws-sdk-sts/types.rb +361 -35
  165. data/lib/aws-sdk-sts.rb +15 -11
  166. data/lib/seahorse/client/async_base.rb +4 -5
  167. data/lib/seahorse/client/async_response.rb +19 -0
  168. data/lib/seahorse/client/base.rb +18 -21
  169. data/lib/seahorse/client/h2/connection.rb +18 -28
  170. data/lib/seahorse/client/h2/handler.rb +19 -3
  171. data/lib/seahorse/client/handler.rb +1 -1
  172. data/lib/seahorse/client/http/response.rb +1 -1
  173. data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
  174. data/lib/seahorse/client/net_http/handler.rb +21 -9
  175. data/lib/seahorse/client/net_http/patches.rb +44 -14
  176. data/lib/seahorse/client/networking_error.rb +1 -1
  177. data/lib/seahorse/client/plugin.rb +9 -0
  178. data/lib/seahorse/client/plugins/endpoint.rb +0 -1
  179. data/lib/seahorse/client/plugins/h2.rb +4 -4
  180. data/lib/seahorse/client/plugins/net_http.rb +57 -16
  181. data/lib/seahorse/client/request_context.rb +9 -2
  182. data/lib/seahorse/client/response.rb +2 -0
  183. data/lib/seahorse/model/shapes.rb +2 -2
  184. data/lib/seahorse/util.rb +2 -1
  185. data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
  186. data/sig/aws-sdk-core/client_stubs.rbs +10 -0
  187. data/sig/aws-sdk-core/errors.rbs +22 -0
  188. data/sig/aws-sdk-core/resources/collection.rbs +21 -0
  189. data/sig/aws-sdk-core/structure.rbs +4 -0
  190. data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
  191. data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
  192. data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
  193. data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
  194. data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
  195. data/sig/aws-sdk-core.rbs +7 -0
  196. data/sig/seahorse/client/async_base.rbs +18 -0
  197. data/sig/seahorse/client/base.rbs +25 -0
  198. data/sig/seahorse/client/handler_builder.rbs +16 -0
  199. data/sig/seahorse/client/response.rbs +61 -0
  200. metadata +117 -23
  201. /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
  202. /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
  203. /data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +0 -0
  204. /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
  205. /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
@@ -20,16 +20,31 @@ a default `:region` is searched for in the following locations:
20
20
  * `ENV['AWS_DEFAULT_REGION']`
21
21
  * `~/.aws/credentials`
22
22
  * `~/.aws/config`
23
- DOCS
23
+ DOCS
24
24
  resolve_region(cfg)
25
25
  end
26
26
 
27
+ option(:sigv4a_signing_region_set,
28
+ doc_type: Array,
29
+ rbs_type: 'Array[String]',
30
+ docstring: <<-DOCS) do |cfg|
31
+ A list of regions that should be signed with SigV4a signing. When
32
+ not passed, a default `:sigv4a_signing_region_set` is searched for
33
+ in the following locations:
34
+
35
+ * `Aws.config[:sigv4a_signing_region_set]`
36
+ * `ENV['AWS_SIGV4A_SIGNING_REGION_SET']`
37
+ * `~/.aws/config`
38
+ DOCS
39
+ resolve_sigv4a_signing_region_set(cfg)
40
+ end
41
+
27
42
  option(:use_dualstack_endpoint,
28
43
  doc_type: 'Boolean',
29
44
  docstring: <<-DOCS) do |cfg|
30
45
  When set to `true`, dualstack enabled endpoints (with `.aws` TLD)
31
46
  will be used if available.
32
- DOCS
47
+ DOCS
33
48
  resolve_use_dualstack_endpoint(cfg)
34
49
  end
35
50
 
@@ -39,7 +54,7 @@ will be used if available.
39
54
  When set to `true`, fips compatible endpoints will be used if available.
40
55
  When a `fips` region is used, the region is normalized and this config
41
56
  is set to `true`.
42
- DOCS
57
+ DOCS
43
58
  resolve_use_fips_endpoint(cfg)
44
59
  end
45
60
 
@@ -52,7 +67,7 @@ is set to `true`.
52
67
  docstring: <<-DOCS) do |cfg|
53
68
  Setting to true disables use of endpoint URLs provided via environment
54
69
  variables and the shared configuration file.
55
- DOCS
70
+ DOCS
56
71
  resolve_ignore_configured_endpoint_urls(cfg)
57
72
  end
58
73
 
@@ -60,14 +75,58 @@ variables and the shared configuration file.
60
75
  The client endpoint is normally constructed from the `:region`
61
76
  option. You should only configure an `:endpoint` when connecting
62
77
  to test or custom endpoints. This should be a valid HTTP(S) URI.
63
- DOCS
78
+ DOCS
64
79
  resolve_endpoint(cfg)
65
80
  end
66
81
 
67
82
  def after_initialize(client)
68
- if client.config.region.nil? || client.config.region == ''
69
- raise Errors::MissingRegionError
83
+ region = client.config.region
84
+ raise Errors::MissingRegionError if region.nil? || region == ''
85
+
86
+ # resolve a default endpoint to preserve legacy behavior
87
+ initialize_default_endpoint(client) if client.config.endpoint.nil?
88
+
89
+ region_set = client.config.sigv4a_signing_region_set
90
+ return if region_set.nil?
91
+ raise Errors::InvalidRegionSetError unless region_set.is_a?(Array)
92
+
93
+ region_set = region_set.compact.reject(&:empty?)
94
+ raise Errors::InvalidRegionSetError if region_set.empty?
95
+
96
+ client.config.sigv4a_signing_region_set = region_set
97
+ end
98
+
99
+ private
100
+
101
+ def initialize_default_endpoint(client)
102
+ client_module = Object.const_get(client.class.name.rpartition('::').first)
103
+ param_class = client_module.const_get(:EndpointParameters)
104
+ endpoint_provider = client.config.endpoint_provider
105
+ params = param_class.create(client.config)
106
+ endpoint = endpoint_provider.resolve_endpoint(params)
107
+ client.config.endpoint = endpoint.url
108
+ rescue ArgumentError, NameError
109
+ # fallback to legacy
110
+ client.config.endpoint = resolve_legacy_endpoint(client.config)
111
+ end
112
+
113
+ # set a default endpoint in config using legacy (endpoints.json) resolver
114
+ def resolve_legacy_endpoint(cfg)
115
+ endpoint_prefix = cfg.api.metadata['endpointPrefix']
116
+ if cfg.respond_to?(:sts_regional_endpoints)
117
+ sts_regional = cfg.sts_regional_endpoints
70
118
  end
119
+
120
+ endpoint = Aws::Partitions::EndpointProvider.resolve(
121
+ cfg.region,
122
+ endpoint_prefix,
123
+ sts_regional,
124
+ {
125
+ dualstack: cfg.use_dualstack_endpoint,
126
+ fips: cfg.use_fips_endpoint
127
+ }
128
+ )
129
+ URI(endpoint)
71
130
  end
72
131
 
73
132
  class << self
@@ -81,6 +140,12 @@ to test or custom endpoints. This should be a valid HTTP(S) URI.
81
140
  env_region || cfg_region
82
141
  end
83
142
 
143
+ def resolve_sigv4a_signing_region_set(cfg)
144
+ value = ENV['AWS_SIGV4A_SIGNING_REGION_SET']
145
+ value ||= Aws.shared_config.sigv4a_signing_region_set(profile: cfg.profile)
146
+ value.split(',') if value
147
+ end
148
+
84
149
  def resolve_use_dualstack_endpoint(cfg)
85
150
  value = ENV['AWS_USE_DUALSTACK_ENDPOINT']
86
151
  value ||= Aws.shared_config.use_dualstack_endpoint(
@@ -121,7 +186,8 @@ to test or custom endpoints. This should be a valid HTTP(S) URI.
121
186
  # that a custom endpoint has NOT been configured by the user
122
187
  cfg.override_config(:regional_endpoint, true)
123
188
 
124
- resolve_legacy_endpoint(cfg)
189
+ # a default endpoint is resolved in after_initialize
190
+ nil
125
191
  end
126
192
 
127
193
  # get a custom configured endpoint from ENV or configuration
@@ -176,23 +242,6 @@ to test or custom endpoints. This should be a valid HTTP(S) URI.
176
242
  cfg.override_config(:region, new_region)
177
243
  end
178
244
  end
179
- # set a default endpoint in config using legacy (endpoints.json) resolver
180
- def resolve_legacy_endpoint(cfg)
181
- endpoint_prefix = cfg.api.metadata['endpointPrefix']
182
- if cfg.respond_to?(:sts_regional_endpoints)
183
- sts_regional = cfg.sts_regional_endpoints
184
- end
185
-
186
- Aws::Partitions::EndpointProvider.resolve(
187
- cfg.region,
188
- endpoint_prefix,
189
- sts_regional,
190
- {
191
- dualstack: cfg.use_dualstack_endpoint,
192
- fips: cfg.use_fips_endpoint
193
- }
194
- )
195
- end
196
245
  end
197
246
  end
198
247
  end
@@ -91,11 +91,20 @@ and 10485780 bytes inclusive.
91
91
  end
92
92
  end
93
93
  end
94
- @handler.call(context)
94
+ with_metric(selected_encoding) { @handler.call(context) }
95
95
  end
96
96
 
97
97
  private
98
98
 
99
+ def with_metric(encoding, &block)
100
+ case encoding
101
+ when 'gzip'
102
+ Aws::Plugins::UserAgent.metric('GZIP_REQUEST_COMPRESSION', &block)
103
+ else
104
+ block.call
105
+ end
106
+ end
107
+
99
108
  def request_encoding_selection(context)
100
109
  encoding_list = context.operation.request_compression['encodings']
101
110
  encoding_list.find { |encoding| RequestCompression::SUPPORTED_ENCODINGS.include?(encoding) }
@@ -104,7 +113,7 @@ and 10485780 bytes inclusive.
104
113
  def update_content_encoding(encoding, context)
105
114
  headers = context.http_request.headers
106
115
  if headers['Content-Encoding']
107
- headers['Content-Encoding'] += ',' + encoding
116
+ headers['Content-Encoding'] += ", #{encoding}"
108
117
  else
109
118
  headers['Content-Encoding'] = encoding
110
119
  end
@@ -3,10 +3,8 @@
3
3
  module Aws
4
4
  module Plugins
5
5
  module Retries
6
-
7
6
  # @api private
8
7
  class ClockSkew
9
-
10
8
  CLOCK_SKEW_THRESHOLD = 5 * 60 # five minutes
11
9
 
12
10
  def initialize
@@ -22,9 +20,9 @@ module Aws
22
20
  end
23
21
 
24
22
  # Gets the clock_correction in seconds to apply to a given endpoint
25
- # @param endpoint [URI / String]
23
+ # @param endpoint [URI, String]
26
24
  def clock_correction(endpoint)
27
- @mutex.synchronize { @endpoint_clock_corrections[endpoint.to_s] }
25
+ @mutex.synchronize { @endpoint_clock_corrections[normalized_endpoint(endpoint)] }
28
26
  end
29
27
 
30
28
  # The estimated skew factors in any clock skew from
@@ -35,7 +33,7 @@ module Aws
35
33
  # Estimated Skew should not be used to correct clock skew errors
36
34
  # it should only be used to estimate TTL for a request
37
35
  def estimated_skew(endpoint)
38
- @mutex.synchronize { @endpoint_estimated_skews[endpoint.to_s] }
36
+ @mutex.synchronize { @endpoint_estimated_skews[normalized_endpoint(endpoint)] }
39
37
  end
40
38
 
41
39
  # Determines whether a request has clock skew by comparing
@@ -55,9 +53,9 @@ module Aws
55
53
  endpoint = context.http_request.endpoint
56
54
  now_utc = Time.now.utc
57
55
  server_time = server_time(context.http_response)
58
- if server_time && (now_utc - server_time).abs > CLOCK_SKEW_THRESHOLD
59
- set_clock_correction(endpoint, server_time - now_utc)
60
- end
56
+ return unless server_time && (now_utc - server_time).abs > CLOCK_SKEW_THRESHOLD
57
+
58
+ set_clock_correction(normalized_endpoint(endpoint), server_time - now_utc)
61
59
  end
62
60
 
63
61
  # Called for every request
@@ -69,20 +67,35 @@ module Aws
69
67
  now_utc = Time.now.utc
70
68
  server_time = server_time(context.http_response)
71
69
  return unless server_time
70
+
72
71
  @mutex.synchronize do
73
- @endpoint_estimated_skews[endpoint.to_s] = server_time - now_utc
72
+ @endpoint_estimated_skews[normalized_endpoint(endpoint)] = server_time - now_utc
74
73
  end
75
74
  end
76
75
 
77
76
  private
78
77
 
78
+ ##
79
+ # @param endpoint [URI, String]
80
+ # the endpoint to normalize
81
+ #
82
+ # @return [String]
83
+ # the endpoint's schema, host, and port - without any path or query arguments
84
+ def normalized_endpoint(endpoint)
85
+ uri = endpoint.is_a?(URI::Generic) ? endpoint : URI(endpoint.to_s)
86
+
87
+ return endpoint.to_s unless uri.scheme && uri.host
88
+
89
+ "#{uri.scheme}://#{uri.host}:#{uri.port}"
90
+ rescue URI::InvalidURIError
91
+ endpoint.to_s
92
+ end
93
+
79
94
  # @param response [Seahorse::Client::Http::Response:]
80
95
  def server_time(response)
81
- begin
82
- Time.parse(response.headers['date']).utc
83
- rescue
84
- nil
85
- end
96
+ Time.parse(response.headers['date']).utc
97
+ rescue StandardError
98
+ nil
86
99
  end
87
100
 
88
101
  # Sets the clock correction for an endpoint
@@ -90,11 +103,10 @@ module Aws
90
103
  # @param correction [Number]
91
104
  def set_clock_correction(endpoint, correction)
92
105
  @mutex.synchronize do
93
- @endpoint_clock_corrections[endpoint.to_s] = correction
106
+ @endpoint_clock_corrections[normalized_endpoint(endpoint)] = correction
94
107
  end
95
108
  end
96
109
  end
97
110
  end
98
111
  end
99
112
  end
100
-
@@ -73,6 +73,7 @@ is only used in the `legacy` retry mode.
73
73
  :retry_jitter,
74
74
  default: :none,
75
75
  doc_type: Symbol,
76
+ rbs_type: '(:none | :equal | :full | ^(Integer) -> Integer)',
76
77
  docstring: <<-DOCS)
77
78
  A delay randomiser function used by the default backoff function.
78
79
  Some predefined functions can be referenced by name - :none, :equal, :full,
@@ -97,6 +98,7 @@ This option is only used in the `legacy` retry mode.
97
98
  :retry_mode,
98
99
  default: 'legacy',
99
100
  doc_type: String,
101
+ rbs_type: '("legacy" | "standard" | "adaptive")',
100
102
  docstring: <<-DOCS) do |cfg|
101
103
  Specifies which retry algorithm to use. Values are:
102
104
 
@@ -111,7 +113,6 @@ Specifies which retry algorithm to use. Values are:
111
113
  functionality of `standard` mode along with automatic client side
112
114
  throttling. This is a provisional mode that may change behavior
113
115
  in the future.
114
-
115
116
  DOCS
116
117
  resolve_retry_mode(cfg)
117
118
  end
@@ -233,7 +234,7 @@ a clock skew correction and retry requests with skewed client clocks.
233
234
 
234
235
  get_send_token(config)
235
236
  add_retry_headers(context)
236
- response = @handler.call(context)
237
+ response = with_metric(config.retry_mode) { @handler.call(context) }
237
238
  error_inspector = Retries::ErrorInspector.new(
238
239
  response.error, response.context.http_response.status_code
239
240
  )
@@ -270,6 +271,10 @@ a clock skew correction and retry requests with skewed client clocks.
270
271
 
271
272
  private
272
273
 
274
+ def with_metric(retry_mode, &block)
275
+ Aws::Plugins::UserAgent.metric("RETRY_MODE_#{retry_mode.upcase}", &block)
276
+ end
277
+
273
278
  def get_send_token(config)
274
279
  # either fail fast or block until a token becomes available
275
280
  # must be configurable
@@ -357,7 +362,7 @@ a clock skew correction and retry requests with skewed client clocks.
357
362
  class LegacyHandler < Seahorse::Client::Handler
358
363
 
359
364
  def call(context)
360
- response = @handler.call(context)
365
+ response = with_metric { @handler.call(context) }
361
366
  if response.error
362
367
  error_inspector = Retries::ErrorInspector.new(
363
368
  response.error, response.context.http_response.status_code
@@ -376,6 +381,10 @@ a clock skew correction and retry requests with skewed client clocks.
376
381
 
377
382
  private
378
383
 
384
+ def with_metric(&block)
385
+ Aws::Plugins::UserAgent.metric('RETRY_MODE_LEGACY', &block)
386
+ end
387
+
379
388
  def retry_if_possible(response, error_inspector)
380
389
  context = response.context
381
390
  if should_retry?(context, error_inspector)
@@ -13,10 +13,6 @@ module Aws
13
13
  option(:sigv4_region)
14
14
  option(:unsigned_operations, default: [])
15
15
 
16
- supported_auth_types = %w[sigv4 bearer none]
17
- supported_auth_types += ['sigv4a'] if Aws::Sigv4::Signer.use_crt?
18
- SUPPORTED_AUTH_TYPES = supported_auth_types.freeze
19
-
20
16
  def add_handlers(handlers, cfg)
21
17
  operations = cfg.api.operation_names - cfg.unsigned_operations
22
18
  handlers.add(Handler, step: :sign, operations: operations)
@@ -24,12 +20,16 @@ module Aws
24
20
 
25
21
  # @api private
26
22
  # Return a signer with the `sign(context)` method
27
- def self.signer_for(auth_scheme, config, region_override = nil)
23
+ def self.signer_for(auth_scheme, config, sigv4_region_override = nil, sigv4_credentials_override = nil)
28
24
  case auth_scheme['name']
29
- when 'sigv4', 'sigv4a'
30
- SignatureV4.new(auth_scheme, config, region_override)
25
+ when 'sigv4', 'sigv4a', 'sigv4-s3express'
26
+ sigv4_overrides = {
27
+ region: sigv4_region_override,
28
+ credentials: sigv4_credentials_override
29
+ }
30
+ SignatureV4.new(auth_scheme, config, sigv4_overrides)
31
31
  when 'bearer'
32
- Bearer.new
32
+ Bearer.new(config)
33
33
  else
34
34
  NullSigner.new
35
35
  end
@@ -42,15 +42,27 @@ module Aws
42
42
  signer = Sign.signer_for(
43
43
  context[:auth_scheme],
44
44
  context.config,
45
- context[:sigv4_region]
45
+ context[:sigv4_region],
46
+ context[:sigv4_credentials]
46
47
  )
47
48
  signer.sign(context)
48
49
  end
49
- @handler.call(context)
50
+ with_metrics(signer) { @handler.call(context) }
50
51
  end
51
52
 
52
53
  private
53
54
 
55
+ def with_metrics(signer, &block)
56
+ case signer
57
+ when SignatureV4
58
+ Aws::Plugins::UserAgent.metric(*signer.credentials.metrics, &block)
59
+ when Bearer
60
+ Aws::Plugins::UserAgent.metric(*signer.token_provider.metrics, &block)
61
+ else
62
+ block.call
63
+ end
64
+ end
65
+
54
66
  def v2_signing?(config)
55
67
  # 's3' is legacy signing, 'v4' is default
56
68
  config.respond_to?(:signature_version) &&
@@ -60,21 +72,19 @@ module Aws
60
72
 
61
73
  # @api private
62
74
  class Bearer
63
- def initialize
75
+ def initialize(config)
76
+ @token_provider = config.token_provider
64
77
  end
65
78
 
79
+ attr_reader :token_provider
80
+
66
81
  def sign(context)
67
82
  if context.http_request.endpoint.scheme != 'https'
68
- raise ArgumentError,
69
- 'Unable to use bearer authorization on non https endpoint.'
83
+ raise ArgumentError, 'Unable to use bearer authorization on non https endpoint.'
70
84
  end
85
+ raise Errors::MissingBearerTokenError unless @token_provider && @token_provider.set?
71
86
 
72
- token_provider = context.config.token_provider
73
-
74
- raise Errors::MissingBearerTokenError unless token_provider&.set?
75
-
76
- context.http_request.headers['Authorization'] =
77
- "Bearer #{token_provider.token.token}"
87
+ context.http_request.headers['Authorization'] = "Bearer #{@token_provider.token.token}"
78
88
  end
79
89
 
80
90
  def presign_url(*args)
@@ -88,34 +98,33 @@ module Aws
88
98
 
89
99
  # @api private
90
100
  class SignatureV4
91
- def initialize(auth_scheme, config, region_override = nil)
101
+ def initialize(auth_scheme, config, sigv4_overrides = {})
92
102
  scheme_name = auth_scheme['name']
93
-
94
- unless %w[sigv4 sigv4a].include?(scheme_name)
95
- raise ArgumentError,
96
- "Expected sigv4 or sigv4a auth scheme, got #{scheme_name}"
103
+ unless %w[sigv4 sigv4a sigv4-s3express].include?(scheme_name)
104
+ raise ArgumentError, "Expected sigv4, sigv4a, or sigv4-s3express auth scheme, got #{scheme_name}"
97
105
  end
98
-
99
106
  region = if scheme_name == 'sigv4a'
100
- auth_scheme['signingRegionSet'].first
107
+ auth_scheme['signingRegionSet'].join(',')
101
108
  else
102
109
  auth_scheme['signingRegion']
103
110
  end
104
111
  begin
105
- @signer = Aws::Sigv4::Signer.new(
112
+ @signer = config.sigv4_signer || Aws::Sigv4::Signer.new(
106
113
  service: config.sigv4_name || auth_scheme['signingName'],
107
- region: region_override || config.sigv4_region || region,
108
- credentials_provider: config.credentials,
114
+ region: sigv4_overrides[:region] || config.sigv4_region || region,
115
+ credentials_provider: sigv4_overrides[:credentials] || config.credentials,
109
116
  signing_algorithm: scheme_name.to_sym,
110
- uri_escape_path: !!!auth_scheme['disableDoubleEncoding'],
111
- normalize_path: !!!auth_scheme['disableNormalizePath'],
112
- unsigned_headers: %w[content-length user-agent x-amzn-trace-id]
117
+ uri_escape_path: !auth_scheme['disableDoubleEncoding'],
118
+ normalize_path: !auth_scheme['disableNormalizePath'],
119
+ unsigned_headers: %w[content-length user-agent x-amzn-trace-id expect transfer-encoding connection]
113
120
  )
114
121
  rescue Aws::Sigv4::Errors::MissingCredentialsError
115
122
  raise Aws::Errors::MissingCredentialsError
116
123
  end
117
124
  end
118
125
 
126
+ attr_reader :signer
127
+
119
128
  def sign(context)
120
129
  req = context.http_request
121
130
 
@@ -151,15 +160,27 @@ module Aws
151
160
  @signer.sign_event(*args)
152
161
  end
153
162
 
163
+ def credentials
164
+ @signer.credentials_provider
165
+ end
166
+
154
167
  private
155
168
 
156
169
  def apply_authtype(context, req)
157
- if context.operation['authtype'].eql?('v4-unsigned-body') &&
158
- req.endpoint.scheme.eql?('https')
170
+ # only used for event streaming at input
171
+ if context[:input_event_emitter]
172
+ req.headers['X-Amz-Content-Sha256'] = 'STREAMING-AWS4-HMAC-SHA256-EVENTS'
173
+ elsif unsigned_payload?(context, req)
159
174
  req.headers['X-Amz-Content-Sha256'] ||= 'UNSIGNED-PAYLOAD'
160
175
  end
161
176
  end
162
177
 
178
+ def unsigned_payload?(context, req)
179
+ (context.operation['unsignedPayload'] ||
180
+ context.operation['authtype'] == 'v4-unsigned-body') &&
181
+ req.endpoint.scheme == 'https'
182
+ end
183
+
163
184
  def reset_signature(req)
164
185
  # in case this request is being re-signed
165
186
  req.headers.delete('Authorization')
@@ -3,7 +3,8 @@
3
3
  module Aws
4
4
  module Plugins
5
5
  # @api private
6
- # Necessary to keep after Endpoints 2.0
6
+ # Deprecated - does not look at new traits like `auth` and `unsignedPayload`
7
+ # Necessary to exist after endpoints 2.0 for old service clients + new core
7
8
  class SignatureV2 < Seahorse::Client::Plugin
8
9
 
9
10
  option(:v2_signer) do |cfg|
@@ -5,7 +5,8 @@ require 'aws-sigv4'
5
5
  module Aws
6
6
  module Plugins
7
7
  # @api private
8
- # Necessary to exist after endpoints 2.0
8
+ # Deprecated - does not look at new traits like `auth` and `unsignedPayload`
9
+ # Necessary to exist after endpoints 2.0 for old service clients + new core
9
10
  class SignatureV4 < Seahorse::Client::Plugin
10
11
 
11
12
  V4_AUTH = %w[v4 v4-unsigned-payload v4-unsigned-body]
@@ -8,6 +8,7 @@ module Aws
8
8
  option(:stub_responses,
9
9
  default: false,
10
10
  doc_type: 'Boolean',
11
+ rbs_type: 'untyped',
11
12
  docstring: <<-DOCS)
12
13
  Causes the client to return stubbed responses. By default
13
14
  fake responses are generated and returned. You can specify
@@ -28,8 +29,22 @@ requests are made, and retries are disabled.
28
29
  end
29
30
  end
30
31
 
32
+ option(:token_provider) do |config|
33
+ if config.stub_responses
34
+ StaticTokenProvider.new('stubbed-token')
35
+ end
36
+ end
37
+
38
+ option(:stubs) { {} }
39
+ option(:stubs_mutex) { Mutex.new }
40
+ option(:api_requests) { [] }
41
+ option(:api_requests_mutex) { Mutex.new }
42
+
31
43
  def add_handlers(handlers, config)
32
- handlers.add(Handler, step: :send) if config.stub_responses
44
+ return unless config.stub_responses
45
+
46
+ handlers.add(ApiRequestsHandler)
47
+ handlers.add(StubbingHandler, step: :send)
33
48
  end
34
49
 
35
50
  def after_initialize(client)
@@ -45,20 +60,43 @@ requests are made, and retries are disabled.
45
60
  end
46
61
  end
47
62
 
48
- class Handler < Seahorse::Client::Handler
63
+ class ApiRequestsHandler < Seahorse::Client::Handler
64
+ def call(context)
65
+ context.config.api_requests_mutex.synchronize do
66
+ context.config.api_requests << {
67
+ operation_name: context.operation_name,
68
+ params: context.params,
69
+ context: context
70
+ }
71
+ end
72
+ @handler.call(context)
73
+ end
74
+ end
49
75
 
76
+ class StubbingHandler < Seahorse::Client::Handler
50
77
  def call(context)
51
- stub = context.client.next_stub(context)
78
+ span_wrapper(context) do
79
+ stub_responses(context)
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def stub_responses(context)
52
86
  resp = Seahorse::Client::Response.new(context: context)
53
87
  async_mode = context.client.is_a? Seahorse::Client::AsyncBase
54
- if Hash === stub && stub[:mutex]
55
- stub[:mutex].synchronize { apply_stub(stub, resp, async_mode) }
88
+ stub = context.client.next_stub(context)
89
+ stub[:mutex].synchronize { apply_stub(stub, resp, async_mode) }
90
+
91
+ if async_mode
92
+ Seahorse::Client::AsyncResponse.new(
93
+ context: context,
94
+ stream: context[:input_event_stream_handler].event_emitter.stream,
95
+ sync_queue: Queue.new
96
+ )
56
97
  else
57
- apply_stub(stub, resp, async_mode)
98
+ resp
58
99
  end
59
-
60
- async_mode ? Seahorse::Client::AsyncResponse.new(
61
- context: context, stream: context[:input_event_stream_handler].event_emitter.stream, sync_queue: Queue.new) : resp
62
100
  end
63
101
 
64
102
  def apply_stub(stub, response, async_mode = false)
@@ -98,6 +136,18 @@ requests are made, and retries are disabled.
98
136
  http_resp.signal_done
99
137
  end
100
138
 
139
+ def span_wrapper(context, &block)
140
+ context.tracer.in_span(
141
+ 'Handler.StubResponses',
142
+ attributes: Aws::Telemetry.http_request_attrs(context)
143
+ ) do |span|
144
+ block.call.tap do
145
+ span.add_attributes(
146
+ Aws::Telemetry.http_response_attrs(context)
147
+ )
148
+ end
149
+ end
150
+ end
101
151
  end
102
152
  end
103
153
  end