aws-sdk-core 3.173.0 → 3.254.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +947 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-defaults/default_configuration.rb +5 -6
  5. data/lib/aws-defaults.rb +4 -1
  6. data/lib/aws-sdk-core/arn.rb +1 -3
  7. data/lib/aws-sdk-core/assume_role_credentials.rb +21 -13
  8. data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +16 -9
  9. data/lib/aws-sdk-core/binary/decode_handler.rb +3 -9
  10. data/lib/aws-sdk-core/binary/encode_handler.rb +1 -1
  11. data/lib/aws-sdk-core/binary/event_builder.rb +34 -37
  12. data/lib/aws-sdk-core/binary/event_stream_decoder.rb +1 -0
  13. data/lib/aws-sdk-core/binary/event_stream_encoder.rb +4 -3
  14. data/lib/aws-sdk-core/cbor/decoder.rb +309 -0
  15. data/lib/aws-sdk-core/cbor/encoder.rb +243 -0
  16. data/lib/aws-sdk-core/cbor.rb +53 -0
  17. data/lib/aws-sdk-core/client_side_monitoring.rb +9 -0
  18. data/lib/aws-sdk-core/client_stubs.rb +39 -55
  19. data/lib/aws-sdk-core/credential_provider.rb +8 -1
  20. data/lib/aws-sdk-core/credential_provider_chain.rb +101 -25
  21. data/lib/aws-sdk-core/credentials.rb +19 -6
  22. data/lib/aws-sdk-core/ec2_metadata.rb +1 -1
  23. data/lib/aws-sdk-core/ecs_credentials.rb +104 -26
  24. data/lib/aws-sdk-core/endpoints/endpoint.rb +3 -1
  25. data/lib/aws-sdk-core/endpoints/matchers.rb +21 -19
  26. data/lib/aws-sdk-core/endpoints.rb +106 -22
  27. data/lib/aws-sdk-core/error_handler.rb +46 -0
  28. data/lib/aws-sdk-core/errors.rb +17 -5
  29. data/lib/aws-sdk-core/event_emitter.rb +1 -17
  30. data/lib/aws-sdk-core/ini_parser.rb +7 -0
  31. data/lib/aws-sdk-core/instance_profile_credentials.rb +181 -158
  32. data/lib/aws-sdk-core/json/builder.rb +23 -1
  33. data/lib/aws-sdk-core/json/error_handler.rb +31 -14
  34. data/lib/aws-sdk-core/json/handler.rb +13 -6
  35. data/lib/aws-sdk-core/json/json_engine.rb +3 -1
  36. data/lib/aws-sdk-core/json/oj_engine.rb +7 -1
  37. data/lib/aws-sdk-core/json/parser.rb +33 -3
  38. data/lib/aws-sdk-core/json.rb +43 -14
  39. data/lib/aws-sdk-core/log/param_filter.rb +2 -2
  40. data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
  41. data/lib/aws-sdk-core/log.rb +10 -0
  42. data/lib/aws-sdk-core/login_credentials.rb +230 -0
  43. data/lib/aws-sdk-core/lru_cache.rb +75 -0
  44. data/lib/aws-sdk-core/pageable_response.rb +3 -1
  45. data/lib/aws-sdk-core/param_validator.rb +9 -4
  46. data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
  47. data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +437 -201
  48. data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
  49. data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
  50. data/lib/aws-sdk-core/plugins/credentials_configuration.rb +78 -56
  51. data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
  52. data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
  53. data/lib/aws-sdk-core/plugins/http_checksum.rb +3 -8
  54. data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
  55. data/lib/aws-sdk-core/plugins/logging.rb +2 -0
  56. data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
  57. data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
  58. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
  59. data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
  60. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +3 -15
  61. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
  62. data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
  63. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +162 -37
  64. data/lib/aws-sdk-core/plugins/request_compression.rb +226 -0
  65. data/lib/aws-sdk-core/plugins/retries/clock_skew.rb +28 -16
  66. data/lib/aws-sdk-core/plugins/retries/retry_quota.rb +11 -8
  67. data/lib/aws-sdk-core/plugins/retry_errors.rb +211 -110
  68. data/lib/aws-sdk-core/plugins/sign.rb +55 -33
  69. data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -1
  70. data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -1
  71. data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
  72. data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
  73. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
  74. data/lib/aws-sdk-core/plugins/user_agent.rb +205 -14
  75. data/lib/aws-sdk-core/plugins.rb +39 -0
  76. data/lib/aws-sdk-core/process_credentials.rb +48 -29
  77. data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
  78. data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
  79. data/lib/aws-sdk-core/query/handler.rb +4 -4
  80. data/lib/aws-sdk-core/query/param_builder.rb +2 -2
  81. data/lib/aws-sdk-core/query.rb +2 -1
  82. data/lib/aws-sdk-core/refreshing_credentials.rb +20 -23
  83. data/lib/aws-sdk-core/resources.rb +8 -0
  84. data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
  85. data/lib/aws-sdk-core/rest/handler.rb +3 -4
  86. data/lib/aws-sdk-core/rest/request/body.rb +32 -5
  87. data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
  88. data/lib/aws-sdk-core/rest/request/headers.rb +15 -7
  89. data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
  90. data/lib/aws-sdk-core/rest/response/body.rb +15 -1
  91. data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
  92. data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
  93. data/lib/aws-sdk-core/rest.rb +1 -0
  94. data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
  95. data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
  96. data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
  97. data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
  98. data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
  99. data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
  100. data/lib/aws-sdk-core/rpc_v2.rb +69 -0
  101. data/lib/aws-sdk-core/shared_config.rb +155 -39
  102. data/lib/aws-sdk-core/shared_credentials.rb +1 -7
  103. data/lib/aws-sdk-core/sso_credentials.rb +6 -3
  104. data/lib/aws-sdk-core/sso_token_provider.rb +1 -0
  105. data/lib/aws-sdk-core/static_token_provider.rb +1 -2
  106. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
  107. data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
  108. data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
  109. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
  110. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
  111. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
  112. data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
  113. data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
  114. data/lib/aws-sdk-core/stubbing.rb +22 -0
  115. data/lib/aws-sdk-core/telemetry/base.rb +177 -0
  116. data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
  117. data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
  118. data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
  119. data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
  120. data/lib/aws-sdk-core/telemetry.rb +78 -0
  121. data/lib/aws-sdk-core/token.rb +3 -3
  122. data/lib/aws-sdk-core/token_provider.rb +4 -0
  123. data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
  124. data/lib/aws-sdk-core/util.rb +41 -1
  125. data/lib/aws-sdk-core/waiters/poller.rb +12 -5
  126. data/lib/aws-sdk-core/xml/builder.rb +17 -9
  127. data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
  128. data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
  129. data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
  130. data/lib/aws-sdk-core/xml/parser.rb +2 -6
  131. data/lib/aws-sdk-core.rb +86 -107
  132. data/lib/aws-sdk-signin/client.rb +1008 -0
  133. data/lib/aws-sdk-signin/client_api.rb +444 -0
  134. data/lib/aws-sdk-signin/customizations.rb +1 -0
  135. data/lib/aws-sdk-signin/endpoint_parameters.rb +85 -0
  136. data/lib/aws-sdk-signin/endpoint_provider.rb +107 -0
  137. data/lib/aws-sdk-signin/endpoints.rb +133 -0
  138. data/lib/aws-sdk-signin/errors.rb +185 -0
  139. data/lib/aws-sdk-signin/plugins/endpoints.rb +77 -0
  140. data/lib/aws-sdk-signin/resource.rb +26 -0
  141. data/lib/aws-sdk-signin/types.rb +909 -0
  142. data/lib/aws-sdk-signin.rb +63 -0
  143. data/lib/aws-sdk-sso/client.rb +210 -99
  144. data/lib/aws-sdk-sso/client_api.rb +7 -0
  145. data/lib/aws-sdk-sso/endpoint_parameters.rb +13 -10
  146. data/lib/aws-sdk-sso/endpoint_provider.rb +30 -28
  147. data/lib/aws-sdk-sso/endpoints.rb +3 -54
  148. data/lib/aws-sdk-sso/plugins/endpoints.rb +23 -22
  149. data/lib/aws-sdk-sso/types.rb +1 -0
  150. data/lib/aws-sdk-sso.rb +15 -11
  151. data/lib/aws-sdk-ssooidc/client.rb +630 -132
  152. data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
  153. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +13 -10
  154. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +30 -28
  155. data/lib/aws-sdk-ssooidc/endpoints.rb +3 -40
  156. data/lib/aws-sdk-ssooidc/errors.rb +62 -0
  157. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +23 -20
  158. data/lib/aws-sdk-ssooidc/types.rb +419 -53
  159. data/lib/aws-sdk-ssooidc.rb +15 -11
  160. data/lib/aws-sdk-sts/client.rb +567 -158
  161. data/lib/aws-sdk-sts/client_api.rb +120 -9
  162. data/lib/aws-sdk-sts/customizations.rb +5 -2
  163. data/lib/aws-sdk-sts/endpoint_parameters.rb +15 -14
  164. data/lib/aws-sdk-sts/endpoint_provider.rb +52 -57
  165. data/lib/aws-sdk-sts/endpoints.rb +3 -118
  166. data/lib/aws-sdk-sts/errors.rb +79 -0
  167. data/lib/aws-sdk-sts/plugins/endpoints.rb +23 -30
  168. data/lib/aws-sdk-sts/presigner.rb +3 -7
  169. data/lib/aws-sdk-sts/types.rb +382 -31
  170. data/lib/aws-sdk-sts.rb +15 -11
  171. data/lib/seahorse/client/async_base.rb +4 -5
  172. data/lib/seahorse/client/async_response.rb +19 -0
  173. data/lib/seahorse/client/base.rb +18 -21
  174. data/lib/seahorse/client/configuration.rb +0 -4
  175. data/lib/seahorse/client/h2/connection.rb +18 -28
  176. data/lib/seahorse/client/h2/handler.rb +19 -3
  177. data/lib/seahorse/client/handler.rb +1 -1
  178. data/lib/seahorse/client/http/response.rb +1 -1
  179. data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
  180. data/lib/seahorse/client/net_http/handler.rb +21 -9
  181. data/lib/seahorse/client/net_http/patches.rb +44 -14
  182. data/lib/seahorse/client/networking_error.rb +1 -1
  183. data/lib/seahorse/client/plugin.rb +9 -0
  184. data/lib/seahorse/client/plugins/endpoint.rb +0 -1
  185. data/lib/seahorse/client/plugins/h2.rb +4 -4
  186. data/lib/seahorse/client/plugins/net_http.rb +57 -16
  187. data/lib/seahorse/client/plugins/request_callback.rb +31 -0
  188. data/lib/seahorse/client/request_context.rb +9 -2
  189. data/lib/seahorse/client/response.rb +8 -0
  190. data/lib/seahorse/model/operation.rb +3 -0
  191. data/lib/seahorse/model/shapes.rb +2 -2
  192. data/lib/seahorse/util.rb +2 -1
  193. data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
  194. data/sig/aws-sdk-core/client_stubs.rbs +10 -0
  195. data/sig/aws-sdk-core/errors.rbs +22 -0
  196. data/sig/aws-sdk-core/resources/collection.rbs +21 -0
  197. data/sig/aws-sdk-core/structure.rbs +4 -0
  198. data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
  199. data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
  200. data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
  201. data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
  202. data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
  203. data/sig/aws-sdk-core.rbs +7 -0
  204. data/sig/seahorse/client/async_base.rbs +18 -0
  205. data/sig/seahorse/client/base.rbs +25 -0
  206. data/sig/seahorse/client/handler_builder.rbs +16 -0
  207. data/sig/seahorse/client/response.rbs +61 -0
  208. metadata +118 -23
  209. /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
  210. /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
  211. /data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +0 -0
  212. /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
  213. /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.173.0
1
+ 3.254.1
@@ -20,7 +20,7 @@ module Aws
20
20
  # * Globally via the "AWS_DEFAULTS_MODE" environment variable.
21
21
  #
22
22
  #
23
- # @code_generation START - documentation
23
+ # #defaults START - documentation
24
24
  # The following `:default_mode` values are supported:
25
25
  #
26
26
  # * `'standard'` -
@@ -105,10 +105,10 @@ module Aws
105
105
  # [2]: https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-retry_mode.html
106
106
  # [3]: https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-sts_regional_endpoints.html
107
107
  #
108
- # @code_generation END - documentation
108
+ # #defaults END - documentation
109
109
  module DefaultsModeConfiguration
110
110
  # @api private
111
- # @code_generation START - configuration
111
+ # #defaults START - configuration
112
112
  SDK_DEFAULT_CONFIGURATION =
113
113
  {
114
114
  "version" => 1,
@@ -128,8 +128,7 @@ module Aws
128
128
  "override" => 3100
129
129
  }
130
130
  },
131
- "in-region" => {
132
- },
131
+ "in-region" => {},
133
132
  "cross-region" => {
134
133
  "connectTimeoutInMillis" => {
135
134
  "override" => 3100
@@ -148,6 +147,6 @@ module Aws
148
147
  }
149
148
  }
150
149
  }
151
- # @code_generation END - configuration
150
+ # #defaults END - configuration
152
151
  end
153
152
  end
data/lib/aws-defaults.rb CHANGED
@@ -1,3 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'aws-defaults/default_configuration'
3
+ module Aws
4
+ autoload :DefaultsModeConfiguration, 'aws-defaults/default_configuration'
5
+ autoload :DefaultsModeConfigResolver, 'aws-defaults/defaults_mode_config_resolver'
6
+ end
@@ -24,9 +24,7 @@ module Aws
24
24
  # arn.resource
25
25
  # # => foo/bar
26
26
  #
27
- # # Note: parser available for parsing resource details
28
- # @see Aws::ARNParser#parse_resource
29
- #
27
+ # @see ARNParser
30
28
  # @see https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-arns
31
29
  class ARN
32
30
 
@@ -7,7 +7,7 @@ module Aws
7
7
  # {Aws::STS::Client#assume_role}.
8
8
  #
9
9
  # role_credentials = Aws::AssumeRoleCredentials.new(
10
- # client: Aws::STS::Client.new(...),
10
+ # client: Aws::STS::Client.new(sts_options),
11
11
  # role_arn: "linked::account::arn",
12
12
  # role_session_name: "session-name"
13
13
  # )
@@ -28,15 +28,15 @@ module Aws
28
28
  # @option options [Integer] :duration_seconds
29
29
  # @option options [String] :external_id
30
30
  # @option options [STS::Client] :client
31
- # @option options [Callable] before_refresh Proc called before
31
+ # @option options [Proc] :before_refresh A Proc called before
32
32
  # credentials are refreshed. Useful for updating tokens.
33
- # `before_refresh` is called when AWS credentials are
34
- # required and need to be refreshed. Tokens can be refreshed using
35
- # the following example:
33
+ # `:before_refresh` is called when AWS credentials are
34
+ # required and need to be refreshed. See the example in this doc.
36
35
  #
37
- # before_refresh = Proc.new do |assume_role_credentials| do
38
- # assume_role_credentials.assume_role_params['token_code'] = update_token
39
- # end
36
+ # @example Tokens can be refreshed using a Proc.
37
+ # before_refresh = Proc.new do |assume_role_credentials|
38
+ # assume_role_credentials.assume_role_params['token_code'] = update_token
39
+ # end
40
40
  #
41
41
  def initialize(options = {})
42
42
  client_opts = {}
@@ -50,6 +50,7 @@ module Aws
50
50
  end
51
51
  @client = client_opts[:client] || STS::Client.new(client_opts)
52
52
  @async_refresh = true
53
+ @metrics = ['CREDENTIALS_STS_ASSUME_ROLE']
53
54
  super
54
55
  end
55
56
 
@@ -62,13 +63,20 @@ module Aws
62
63
  private
63
64
 
64
65
  def refresh
65
- c = @client.assume_role(@assume_role_params).credentials
66
+ resp = @client.assume_role(@assume_role_params)
67
+ creds = resp.credentials
66
68
  @credentials = Credentials.new(
67
- c.access_key_id,
68
- c.secret_access_key,
69
- c.session_token
69
+ creds.access_key_id,
70
+ creds.secret_access_key,
71
+ creds.session_token,
72
+ account_id: parse_account_id(resp)
70
73
  )
71
- @expiration = c.expiration
74
+ @expiration = creds.expiration
75
+ end
76
+
77
+ def parse_account_id(resp)
78
+ arn = resp.assumed_role_user&.arn
79
+ ARNParser.parse(arn).account_id if ARNParser.arn?(arn)
72
80
  end
73
81
 
74
82
  class << self
@@ -9,11 +9,11 @@ module Aws
9
9
  # {Aws::STS::Client#assume_role_with_web_identity}.
10
10
  #
11
11
  # role_credentials = Aws::AssumeRoleWebIdentityCredentials.new(
12
- # client: Aws::STS::Client.new(...),
12
+ # client: Aws::STS::Client.new(sts_options),
13
13
  # role_arn: "linked::account::arn",
14
14
  # web_identity_token_file: "/path/to/token/file",
15
15
  # role_session_name: "session-name"
16
- # ...
16
+ # # ...
17
17
  # )
18
18
  # ec2 = Aws::EC2::Client.new(credentials: role_credentials)
19
19
  #
@@ -60,7 +60,8 @@ module Aws
60
60
  # not provided, generate encoded UUID as session name
61
61
  @assume_role_web_identity_params[:role_session_name] = _session_name
62
62
  end
63
- @client = client_opts[:client] || STS::Client.new(client_opts.merge(credentials: false))
63
+ @client = client_opts[:client] || STS::Client.new(client_opts.merge(credentials: nil))
64
+ @metrics = ['CREDENTIALS_STS_ASSUME_ROLE_WEB_ID']
64
65
  super
65
66
  end
66
67
 
@@ -73,14 +74,15 @@ module Aws
73
74
  # read from token file everytime it refreshes
74
75
  @assume_role_web_identity_params[:web_identity_token] = _token_from_file(@token_file)
75
76
 
76
- c = @client.assume_role_with_web_identity(
77
- @assume_role_web_identity_params).credentials
77
+ resp = @client.assume_role_with_web_identity(@assume_role_web_identity_params)
78
+ creds = resp.credentials
78
79
  @credentials = Credentials.new(
79
- c.access_key_id,
80
- c.secret_access_key,
81
- c.session_token
80
+ creds.access_key_id,
81
+ creds.secret_access_key,
82
+ creds.session_token,
83
+ account_id: parse_account_id(resp)
82
84
  )
83
- @expiration = c.expiration
85
+ @expiration = creds.expiration
84
86
  end
85
87
 
86
88
  def _token_from_file(path)
@@ -94,6 +96,11 @@ module Aws
94
96
  Base64.strict_encode64(SecureRandom.uuid)
95
97
  end
96
98
 
99
+ def parse_account_id(resp)
100
+ arn = resp.assumed_role_user&.arn
101
+ ARNParser.parse(arn).account_id if ARNParser.arn?(arn)
102
+ end
103
+
97
104
  class << self
98
105
 
99
106
  # @api private
@@ -22,22 +22,16 @@ module Aws
22
22
  end
23
23
 
24
24
  def attach_eventstream_listeners(context, rules)
25
-
26
25
  context.http_response.on_headers(200) do
27
- protocol = context.config.api.metadata['protocol']
28
- output_handler = context[:output_event_stream_handler] || context[:event_stream_handler]
26
+ output_handler = context[:output_event_stream_handler] ||
27
+ context[:event_stream_handler]
29
28
  context.http_response.body = EventStreamDecoder.new(
30
- protocol,
29
+ context.config.protocol,
31
30
  rules,
32
31
  context.operation.output,
33
32
  context.operation.errors,
34
33
  context.http_response.body,
35
34
  output_handler)
36
- if input_emitter = context[:input_event_emitter]
37
- # #emit will be blocked until 200 success
38
- # see Aws::EventEmitter#emit
39
- input_emitter.signal_queue << "ready"
40
- end
41
35
  end
42
36
 
43
37
  context.http_response.on_success(200) do
@@ -10,7 +10,7 @@ module Aws
10
10
  if eventstream_member = eventstream_input?(context)
11
11
  input_es_handler = context[:input_event_stream_handler]
12
12
  input_es_handler.event_emitter.encoder = EventStreamEncoder.new(
13
- context.config.api.metadata['protocol'],
13
+ context.config.protocol,
14
14
  eventstream_member,
15
15
  context.operation.input,
16
16
  signer_for(context)
@@ -42,41 +42,39 @@ module Aws
42
42
  end
43
43
  end
44
44
 
45
- # implict payload
46
- if !explicit_payload && !implicit_payload_members.empty?
47
- if implicit_payload_members.size > 1
48
- payload_shape = Shapes::StructureShape.new
49
- implicit_payload_members.each do |m_name, m_ref|
50
- payload_shape.add_member(m_name, m_ref)
51
- end
52
- payload_ref = Shapes::ShapeRef.new(shape: payload_shape)
53
-
54
- payload = build_payload_members(payload_ref, params)
55
- else
56
- m_name, m_ref = implicit_payload_members.first
57
- streaming, content_type = _content_type(m_ref.shape)
58
-
59
- es_headers[":content-type"] = Aws::EventStream::HeaderValue.new(
60
- type: "string", value: content_type)
61
- payload = _build_payload(streaming, m_ref, params[m_name])
62
- end
63
- end
64
-
65
-
45
+ # handle header members for all cases
66
46
  event_ref.shape.members.each do |member_name, member_ref|
67
47
  if member_ref.eventheader && params[member_name]
68
48
  header_value = params[member_name]
69
49
  es_headers[member_ref.shape.name] = Aws::EventStream::HeaderValue.new(
70
- type: _header_value_type(member_ref.shape, header_value),
50
+ type: header_value_type(member_ref.shape, header_value),
71
51
  value: header_value
72
52
  )
73
- elsif member_ref.eventpayload && params[member_name]
74
- # explicit payload
75
- streaming, content_type = _content_type(member_ref.shape)
53
+ end
54
+ end
55
+
56
+ # implict payload
57
+ if !explicit_payload && !implicit_payload_members.empty?
58
+ payload_shape = StructureShape.new
59
+ implicit_payload_members.each do |m_name, m_ref|
60
+ payload_shape.add_member(m_name, m_ref)
61
+ end
62
+ payload_ref = ShapeRef.new(shape: payload_shape)
76
63
 
77
- es_headers[":content-type"] = Aws::EventStream::HeaderValue.new(
78
- type: "string", value: content_type)
79
- payload = _build_payload(streaming, member_ref, params[member_name])
64
+ payload = build_payload_members(payload_ref, params)
65
+ .force_encoding(Encoding::BINARY)
66
+
67
+
68
+ es_headers[":content-type"] = Aws::EventStream::HeaderValue.new(
69
+ type: "string", value: content_type(payload_ref.shape))
70
+ else
71
+ # explicit payload, serialize just the payload member
72
+ event_ref.shape.members.each do |member_name, member_ref|
73
+ if member_ref.eventpayload && params[member_name]
74
+ es_headers[":content-type"] = Aws::EventStream::HeaderValue.new(
75
+ type: "string", value: content_type(member_ref.shape))
76
+ payload = params[member_name]
77
+ end
80
78
  end
81
79
  end
82
80
 
@@ -86,15 +84,15 @@ module Aws
86
84
  )
87
85
  end
88
86
 
89
- def _content_type(shape)
87
+ def content_type(shape)
90
88
  case shape
91
- when BlobShape then [true, "application/octet-stream"]
92
- when StringShape then [true, "text/plain"]
89
+ when BlobShape then "application/octet-stream"
90
+ when StringShape then "text/plain"
93
91
  when StructureShape then
94
92
  if @serializer_class.name.include?('Xml')
95
- [false, "text/xml"]
93
+ "text/xml"
96
94
  elsif @serializer_class.name.include?('Json')
97
- [false, "application/json"]
95
+ "application/json"
98
96
  end
99
97
  else
100
98
  raise Aws::Errors::EventStreamBuilderError.new(
@@ -102,7 +100,7 @@ module Aws
102
100
  end
103
101
  end
104
102
 
105
- def _header_value_type(shape, value)
103
+ def header_value_type(shape, value)
106
104
  case shape
107
105
  when StringShape then "string"
108
106
  when IntegerShape then "integer"
@@ -115,10 +113,9 @@ module Aws
115
113
  end
116
114
  end
117
115
 
118
- def _build_payload(streaming, ref, value)
119
- streaming ? value : @serializer_class.new(ref).serialize(value)
116
+ def build_payload_members(payload_ref, params)
117
+ @serializer_class.new(payload_ref).serialize(params)
120
118
  end
121
-
122
119
  end
123
120
  end
124
121
  end
@@ -47,6 +47,7 @@ module Aws
47
47
  when 'rest-xml' then Aws::Xml::Parser
48
48
  when 'rest-json' then Aws::Json::Parser
49
49
  when 'json' then Aws::Json::Parser
50
+ when 'smithy-rpc-v2-cbor' then Aws::RpcV2::Parser
50
51
  else raise "unsupported protocol #{protocol} for event stream"
51
52
  end
52
53
  end
@@ -43,9 +43,10 @@ module Aws
43
43
 
44
44
  def serializer_class(protocol)
45
45
  case protocol
46
- when 'rest-xml' then Xml::Builder
47
- when 'rest-json' then Json::Builder
48
- when 'json' then Json::Builder
46
+ when 'rest-xml' then Aws::Xml::Builder
47
+ when 'rest-json' then Aws::Json::Builder
48
+ when 'json' then Aws::Json::Builder
49
+ when 'smithy-rpc-v2-cbor' then Aws::RpcV2::Builder
49
50
  else raise "unsupported protocol #{protocol} for event stream"
50
51
  end
51
52
  end
@@ -0,0 +1,309 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module Cbor
5
+ # Pure Ruby implementation of CBOR Decoder
6
+ class Decoder
7
+ def initialize(bytes)
8
+ @buffer = bytes
9
+ @pos = 0
10
+ @depth = 0
11
+ end
12
+
13
+ def decode
14
+ return nil if @buffer.nil? || @buffer.empty?
15
+
16
+ val = decode_item
17
+ return val unless @pos != @buffer.size
18
+
19
+ raise ExtraBytesError.new(@pos, @buffer.size)
20
+ end
21
+
22
+ private
23
+
24
+ FIVE_BIT_MASK = 0x1F
25
+ TAG_TYPE_EPOCH = 1
26
+ TAG_TYPE_BIGNUM = 2
27
+ TAG_TYPE_NEG_BIGNUM = 3
28
+ TAG_TYPE_BIGDEC = 4
29
+ MAX_DEPTH = 128 # Value chosen to match other SDKs
30
+
31
+ # high level, generic decode. Based on the next type. Consumes and returns
32
+ # the next item as a ruby object.
33
+ def decode_item
34
+ @depth += 1
35
+ raise Error, "Maximum nesting depth (#{MAX_DEPTH}) exceeded" if @depth > MAX_DEPTH
36
+
37
+ case (next_type = peek_type)
38
+ when :array
39
+ read_array.times.map { decode_item }
40
+ when :map
41
+ read_map.times.map { [read_string, decode_item] }.to_h
42
+ when :indefinite_array
43
+ read_start_indefinite_array
44
+ value = []
45
+ value << decode_item until peek_type == :break_stop_code
46
+ read_end_indefinite_collection
47
+ value
48
+ when :indefinite_map
49
+ read_start_indefinite_map
50
+ value = {}
51
+ value[read_string] = decode_item until peek_type == :break_stop_code
52
+ read_end_indefinite_collection
53
+ value
54
+ when :indefinite_binary_string
55
+ read_info
56
+ value = String.new
57
+ value << read_binary_string until peek_type == :break_stop_code
58
+ read_end_indefinite_collection
59
+ value
60
+ when :indefinite_string
61
+ read_info
62
+ value = String.new
63
+ value << read_string until peek_type == :break_stop_code
64
+ read_end_indefinite_collection
65
+ value.force_encoding(Encoding::UTF_8)
66
+ when :tag
67
+ case (tag = read_tag)
68
+ when TAG_TYPE_EPOCH
69
+ item = decode_item
70
+ Time.at(item)
71
+ when TAG_TYPE_BIGNUM, TAG_TYPE_NEG_BIGNUM
72
+ read_bignum(tag)
73
+ when TAG_TYPE_BIGDEC
74
+ read_big_decimal
75
+ else
76
+ Tagged.new(tag, decode_item)
77
+ end
78
+ when :break_stop_code
79
+ raise UnexpectedBreakCodeError
80
+ else
81
+ send("read_#{next_type}")
82
+ end
83
+ ensure
84
+ @depth -= 1
85
+ end
86
+
87
+ # low level streaming interface
88
+ def peek_type
89
+ ib = peek(1).ord
90
+ add_info = ib & FIVE_BIT_MASK
91
+ major_type = ib >> 5
92
+ case major_type
93
+ when 0, 1 then :integer
94
+ when 2
95
+ add_info == 31 ? :indefinite_binary_string : :binary_string
96
+ when 3
97
+ add_info == 31 ? :indefinite_string : :string
98
+ when 4
99
+ add_info == 31 ? :indefinite_array : :array
100
+ when 5
101
+ add_info == 31 ? :indefinite_map : :map
102
+ when 6 then :tag
103
+ when 7 # simple or float
104
+ case add_info
105
+ when 20, 21 then :boolean
106
+ when 22 then :nil
107
+ when 23 then :undefined # for smithy, this should be parsed as nil
108
+ when 25 then :half
109
+ when 26 then :float
110
+ when 27 then :double
111
+ when 31 then :break_stop_code
112
+ else
113
+ :reserved_undefined
114
+ end
115
+ end
116
+ end
117
+
118
+ def read_break_stop_code
119
+ read_info
120
+ :break_stop_code
121
+ end
122
+
123
+ def read_integer
124
+ major_type, add_info = read_info
125
+
126
+ val = read_count(add_info)
127
+ case major_type
128
+ when 0 then val
129
+ when 1 then -1 - val
130
+ else
131
+ raise Error, "Expected Integer (0,1) got major type: #{major_type}"
132
+ end
133
+ end
134
+
135
+ def read_binary_string
136
+ _major_type, add_info = read_info
137
+ take(read_count(add_info)).force_encoding(Encoding::BINARY)
138
+ end
139
+
140
+ def read_string
141
+ _major_type, add_info = read_info
142
+ take(read_count(add_info)).force_encoding(Encoding::UTF_8)
143
+ end
144
+
145
+ # returns only the length of the array, caller must read the correct number of values after this
146
+ def read_array
147
+ _major_type, add_info = read_info
148
+ read_count(add_info)
149
+ end
150
+
151
+ # returns nothing but consumes and checks the type/info.
152
+ # Caller must keep reading until encountering the stop sequence
153
+ def read_start_indefinite_array
154
+ read_info
155
+ end
156
+
157
+ # returns nothing but consumes and checks the type/info.
158
+ # Caller must keep reading until encountering the stop sequence
159
+ def read_start_indefinite_map
160
+ read_info
161
+ end
162
+
163
+ # returns nothing but consumes and checks the type/info.
164
+ def read_end_indefinite_collection
165
+ read_info
166
+ end
167
+
168
+ # returns only the length of the array, caller must read the correct number of key value pairs after this
169
+ def read_map
170
+ _major_type, add_info = read_info
171
+ read_count(add_info)
172
+ end
173
+
174
+ # returns only the tag, caller must interpret the tag and read another value as appropriate
175
+ def read_tag
176
+ _major_type, add_info = read_info
177
+ read_count(add_info)
178
+ end
179
+
180
+ def read_reserved_undefined
181
+ _major_type, add_info = read_info
182
+ raise Error, "Undefined reserved additional information: #{add_info}"
183
+ end
184
+
185
+ def read_boolean
186
+ _major_type, add_info = read_info
187
+ case add_info
188
+ when 20 then false
189
+ when 21 then true
190
+ else
191
+ raise Error, "Invalid Boolean simple type, expected add_info of 20 or 21, got: #{add_info}"
192
+ end
193
+ end
194
+
195
+ def read_nil
196
+ read_info
197
+ nil
198
+ end
199
+
200
+ def read_undefined
201
+ read_info
202
+ :undefined
203
+ end
204
+
205
+ # 16 bit IEEE 754 half-precision floats
206
+ # Support decoding only
207
+ # format:
208
+ # sign - 1 bit
209
+ # exponent - 5 bits
210
+ # precision - 10 bits
211
+ def read_half
212
+ read_info
213
+ b16 = take(2).unpack1('n')
214
+ exp = (b16 >> 10) & 0x1f
215
+ mant = b16 & 0x3ff
216
+ val =
217
+ case exp
218
+ when 0
219
+ Math.ldexp(mant, -24)
220
+ when 31
221
+ mant.zero? ? Float::INFINITY : Float::NAN
222
+ else
223
+ # exp bias is 15, but to use ldexp we divide by 1024 (2^10) to get
224
+ # exp-15-10
225
+ Math.ldexp(1024 + mant, exp - 25)
226
+ end
227
+ if b16[15].zero?
228
+ val
229
+ else
230
+ -val
231
+ end
232
+ end
233
+
234
+ def read_float
235
+ read_info
236
+ take(4).unpack1('g')
237
+ end
238
+
239
+ def read_double
240
+ read_info
241
+ take(8).unpack1('G')
242
+ end
243
+
244
+ # tag type 2 or 3
245
+ def read_bignum(tag_value)
246
+ _major_type, add_info = read_info
247
+ bstr = take(read_count(add_info))
248
+ v = bstr.bytes.inject(0) do |sum, b|
249
+ sum <<= 8
250
+ sum + b
251
+ end
252
+ case tag_value
253
+ when 2 then v
254
+ when 3 then -1 - v
255
+ else
256
+ raise Error, "Invalid Tag value for BigNum, expected 2 or 3, got: #{tag_value}"
257
+ end
258
+ end
259
+
260
+ # A decimal fraction or a bigfloat is represented as a tagged array
261
+ # that contains exactly two integer numbers:
262
+ # an exponent e and a mantissa m
263
+ # See: https://www.rfc-editor.org/rfc/rfc8949.html#name-decimal-fractions-and-bigfl
264
+ def read_big_decimal
265
+ unless (s = read_array) == 2
266
+ raise Error, "Expected array of length 2 but length is: #{s}"
267
+ end
268
+
269
+ e = read_integer
270
+ m = read_integer
271
+ BigDecimal(m) * (BigDecimal(10)**BigDecimal(e))
272
+ end
273
+
274
+ # return a tuple of major_type, add_info
275
+ def read_info
276
+ ib = take(1).ord
277
+ [ib >> 5, ib & FIVE_BIT_MASK]
278
+ end
279
+
280
+ def read_count(add_info)
281
+ case add_info
282
+ when 0..23 then add_info
283
+ when 24 then take(1).ord
284
+ when 25 then take(2).unpack1('n')
285
+ when 26 then take(4).unpack1('N')
286
+ when 27 then take(8).unpack1('Q>')
287
+ when 28 then take(16).unpack1('Q>')
288
+ when 29 then take(32).unpack1('Q>')
289
+ else raise UnexpectedAdditionalInformationError, add_info
290
+ end
291
+ end
292
+
293
+ def take(n_bytes)
294
+ opos = @pos
295
+ @pos += n_bytes
296
+
297
+ return @buffer[opos, n_bytes] if @pos <= @buffer.bytesize
298
+
299
+ raise OutOfBytesError.new(n_bytes, @buffer.bytesize - @pos)
300
+ end
301
+
302
+ def peek(n_bytes)
303
+ return @buffer[@pos, n_bytes] if (@pos + n_bytes) <= @buffer.bytesize
304
+
305
+ raise OutOfBytesError.new(n_bytes, @buffer.bytesize - @pos)
306
+ end
307
+ end
308
+ end
309
+ end