aws-sdk-core 3.171.1 → 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.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +787 -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 +308 -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 +33 -55
  19. data/lib/aws-sdk-core/credential_provider.rb +8 -1
  20. data/lib/aws-sdk-core/credential_provider_chain.rb +74 -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 +92 -24
  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 +14 -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 +168 -155
  32. data/lib/aws-sdk-core/json/builder.rb +8 -1
  33. data/lib/aws-sdk-core/json/error_handler.rb +29 -13
  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/formatter.rb +6 -0
  40. data/lib/aws-sdk-core/log/param_filter.rb +2 -2
  41. data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
  42. data/lib/aws-sdk-core/log.rb +10 -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 +348 -169
  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/retry_errors.rb +12 -3
  66. data/lib/aws-sdk-core/plugins/sign.rb +55 -33
  67. data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -1
  68. data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -1
  69. data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
  70. data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
  71. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
  72. data/lib/aws-sdk-core/plugins/user_agent.rb +192 -14
  73. data/lib/aws-sdk-core/plugins.rb +39 -0
  74. data/lib/aws-sdk-core/process_credentials.rb +48 -29
  75. data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
  76. data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
  77. data/lib/aws-sdk-core/query/handler.rb +4 -4
  78. data/lib/aws-sdk-core/query/param_builder.rb +2 -2
  79. data/lib/aws-sdk-core/query.rb +2 -1
  80. data/lib/aws-sdk-core/refreshing_credentials.rb +20 -23
  81. data/lib/aws-sdk-core/resources.rb +8 -0
  82. data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
  83. data/lib/aws-sdk-core/rest/handler.rb +3 -4
  84. data/lib/aws-sdk-core/rest/request/body.rb +32 -5
  85. data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
  86. data/lib/aws-sdk-core/rest/request/headers.rb +15 -7
  87. data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
  88. data/lib/aws-sdk-core/rest/response/body.rb +15 -1
  89. data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
  90. data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
  91. data/lib/aws-sdk-core/rest.rb +1 -0
  92. data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
  93. data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
  94. data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
  95. data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
  96. data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
  97. data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
  98. data/lib/aws-sdk-core/rpc_v2.rb +69 -0
  99. data/lib/aws-sdk-core/shared_config.rb +135 -39
  100. data/lib/aws-sdk-core/shared_credentials.rb +1 -7
  101. data/lib/aws-sdk-core/sso_credentials.rb +6 -3
  102. data/lib/aws-sdk-core/static_token_provider.rb +1 -2
  103. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
  104. data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
  105. data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
  106. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
  107. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
  108. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
  109. data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
  110. data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
  111. data/lib/aws-sdk-core/stubbing.rb +22 -0
  112. data/lib/aws-sdk-core/telemetry/base.rb +177 -0
  113. data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
  114. data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
  115. data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
  116. data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
  117. data/lib/aws-sdk-core/telemetry.rb +78 -0
  118. data/lib/aws-sdk-core/token.rb +3 -3
  119. data/lib/aws-sdk-core/token_provider.rb +4 -0
  120. data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
  121. data/lib/aws-sdk-core/util.rb +41 -1
  122. data/lib/aws-sdk-core/waiters/poller.rb +12 -5
  123. data/lib/aws-sdk-core/xml/builder.rb +17 -9
  124. data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
  125. data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
  126. data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
  127. data/lib/aws-sdk-core/xml/parser.rb +2 -6
  128. data/lib/aws-sdk-core.rb +82 -107
  129. data/lib/aws-sdk-sso/client.rb +205 -92
  130. data/lib/aws-sdk-sso/client_api.rb +7 -0
  131. data/lib/aws-sdk-sso/endpoint_parameters.rb +9 -6
  132. data/lib/aws-sdk-sso/endpoint_provider.rb +30 -28
  133. data/lib/aws-sdk-sso/endpoints.rb +3 -54
  134. data/lib/aws-sdk-sso/plugins/endpoints.rb +23 -22
  135. data/lib/aws-sdk-sso/types.rb +1 -0
  136. data/lib/aws-sdk-sso.rb +15 -11
  137. data/lib/aws-sdk-ssooidc/client.rb +625 -125
  138. data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
  139. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +9 -6
  140. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +30 -28
  141. data/lib/aws-sdk-ssooidc/endpoints.rb +3 -40
  142. data/lib/aws-sdk-ssooidc/errors.rb +62 -0
  143. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +23 -20
  144. data/lib/aws-sdk-ssooidc/types.rb +419 -53
  145. data/lib/aws-sdk-ssooidc.rb +15 -11
  146. data/lib/aws-sdk-sts/client.rb +526 -243
  147. data/lib/aws-sdk-sts/client_api.rb +48 -9
  148. data/lib/aws-sdk-sts/customizations.rb +5 -2
  149. data/lib/aws-sdk-sts/endpoint_parameters.rb +10 -9
  150. data/lib/aws-sdk-sts/endpoint_provider.rb +82 -84
  151. data/lib/aws-sdk-sts/endpoints.rb +3 -118
  152. data/lib/aws-sdk-sts/errors.rb +15 -0
  153. data/lib/aws-sdk-sts/plugins/endpoints.rb +23 -30
  154. data/lib/aws-sdk-sts/presigner.rb +3 -7
  155. data/lib/aws-sdk-sts/types.rb +217 -36
  156. data/lib/aws-sdk-sts.rb +15 -11
  157. data/lib/seahorse/client/async_base.rb +4 -5
  158. data/lib/seahorse/client/async_response.rb +19 -0
  159. data/lib/seahorse/client/base.rb +18 -21
  160. data/lib/seahorse/client/configuration.rb +0 -4
  161. data/lib/seahorse/client/h2/connection.rb +18 -28
  162. data/lib/seahorse/client/h2/handler.rb +14 -3
  163. data/lib/seahorse/client/handler.rb +1 -1
  164. data/lib/seahorse/client/http/response.rb +1 -1
  165. data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
  166. data/lib/seahorse/client/net_http/handler.rb +21 -9
  167. data/lib/seahorse/client/net_http/patches.rb +1 -4
  168. data/lib/seahorse/client/networking_error.rb +1 -1
  169. data/lib/seahorse/client/plugin.rb +9 -0
  170. data/lib/seahorse/client/plugins/endpoint.rb +0 -1
  171. data/lib/seahorse/client/plugins/h2.rb +4 -4
  172. data/lib/seahorse/client/plugins/net_http.rb +57 -16
  173. data/lib/seahorse/client/plugins/request_callback.rb +31 -0
  174. data/lib/seahorse/client/request_context.rb +9 -2
  175. data/lib/seahorse/client/response.rb +8 -0
  176. data/lib/seahorse/model/operation.rb +3 -0
  177. data/lib/seahorse/model/shapes.rb +2 -2
  178. data/lib/seahorse/util.rb +2 -1
  179. data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
  180. data/sig/aws-sdk-core/client_stubs.rbs +10 -0
  181. data/sig/aws-sdk-core/errors.rbs +22 -0
  182. data/sig/aws-sdk-core/resources/collection.rbs +21 -0
  183. data/sig/aws-sdk-core/structure.rbs +4 -0
  184. data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
  185. data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
  186. data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
  187. data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
  188. data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
  189. data/sig/aws-sdk-core.rbs +7 -0
  190. data/sig/seahorse/client/async_base.rbs +18 -0
  191. data/sig/seahorse/client/base.rbs +25 -0
  192. data/sig/seahorse/client/handler_builder.rbs +16 -0
  193. data/sig/seahorse/client/response.rbs +61 -0
  194. metadata +106 -23
  195. /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
  196. /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
  197. /data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +0 -0
  198. /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
  199. /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ # setup autoloading for Plugins
5
+ # Most plugins are required explicitly from service clients
6
+ # but users may reference them outside of client usage.
7
+ module Plugins
8
+ autoload :ApiKey, 'aws-sdk-core/plugins/api_key'
9
+ autoload :BearerAuthorization, 'aws-sdk-core/plugins/bearer_authorization'
10
+ autoload :ChecksumAlgorithm, 'aws-sdk-core/plugins/checksum_algorithm'
11
+ autoload :ClientMetricsPlugin, 'aws-sdk-core/plugins/client_metrics_plugin'
12
+ autoload :ClientMetricsSendPlugin, 'aws-sdk-core/plugins/client_metrics_send_plugin'
13
+ autoload :CredentialsConfiguration, 'aws-sdk-core/plugins/credentials_configuration'
14
+ autoload :DefaultsMode, 'aws-sdk-core/plugins/defaults_mode'
15
+ autoload :EndpointDiscovery, 'aws-sdk-core/plugins/endpoint_discovery'
16
+ autoload :EndpointPattern, 'aws-sdk-core/plugins/endpoint_pattern'
17
+ autoload :EventStreamConfiguration, 'aws-sdk-core/plugins/event_stream_configuration'
18
+ autoload :GlobalConfiguration, 'aws-sdk-core/plugins/global_configuration'
19
+ autoload :HelpfulSocketErrors, 'aws-sdk-core/plugins/helpful_socket_errors'
20
+ autoload :HttpChecksum, 'aws-sdk-core/plugins/http_checksum'
21
+ autoload :IdempotencyToken, 'aws-sdk-core/plugins/idempotency_token'
22
+ autoload :InvocationId, 'aws-sdk-core/plugins/invocation_id'
23
+ autoload :JsonvalueConverter, 'aws-sdk-core/plugins/jsonvalue_converter'
24
+ autoload :Logging, 'aws-sdk-core/plugins/logging'
25
+ autoload :ParamConverter, 'aws-sdk-core/plugins/param_converter'
26
+ autoload :ParamValidator, 'aws-sdk-core/plugins/param_validator'
27
+ autoload :RecursionDetection, 'aws-sdk-core/plugins/recursion_detection'
28
+ autoload :RegionalEndpoint, 'aws-sdk-core/plugins/regional_endpoint'
29
+ autoload :RequestCompression, 'aws-sdk-core/plugins/request_compression'
30
+ autoload :ResponsePaging, 'aws-sdk-core/plugins/response_paging'
31
+ autoload :RetryErrors, 'aws-sdk-core/plugins/retry_errors'
32
+ autoload :Sign, 'aws-sdk-core/plugins/sign'
33
+ autoload :SignatureV4, 'aws-sdk-core/plugins/signature_v4'
34
+ autoload :StubResponses, 'aws-sdk-core/plugins/stub_responses'
35
+ autoload :Telemetry, 'aws-sdk-core/plugins/telemetry'
36
+ autoload :TransferEncoding, 'aws-sdk-core/plugins/transfer_encoding'
37
+ autoload :UserAgent, 'aws-sdk-core/plugins/user_agent'
38
+ end
39
+ end
@@ -2,9 +2,15 @@
2
2
 
3
3
  module Aws
4
4
  # A credential provider that executes a given process and attempts
5
- # to read its stdout to recieve a JSON payload containing the credentials.
5
+ # to read its stdout to receive a JSON payload containing the credentials.
6
6
  #
7
- # credentials = Aws::ProcessCredentials.new('/usr/bin/credential_proc')
7
+ # credentials = Aws::ProcessCredentials.new(['/usr/bin/credential_proc'])
8
+ # ec2 = Aws::EC2::Client.new(credentials: credentials)
9
+ #
10
+ # Arguments should be provided as strings in the array, for example:
11
+ #
12
+ # process = ['/usr/bin/credential_proc', 'arg1', 'arg2']
13
+ # credentials = Aws::ProcessCredentials.new(process)
8
14
  # ec2 = Aws::EC2::Client.new(credentials: credentials)
9
15
  #
10
16
  # Automatically handles refreshing credentials if an Expiration time is
@@ -19,56 +25,69 @@ module Aws
19
25
  # Creates a new ProcessCredentials object, which allows an
20
26
  # external process to be used as a credential provider.
21
27
  #
22
- # @param [String] process Invocation string for process
23
- # credentials provider.
28
+ # @param [Array<String>, String] process An array of strings including
29
+ # the process name and its arguments to execute, or a single string to be
30
+ # executed by the shell (deprecated and insecure).
24
31
  def initialize(process)
32
+ if process.is_a?(String)
33
+ warn('Passing a single string to Aws::ProcessCredentials.new '\
34
+ 'is insecure, please use use an array of system arguments instead')
35
+ end
25
36
  @process = process
26
- @credentials = credentials_from_process(@process)
37
+ @credentials = credentials_from_process
27
38
  @async_refresh = false
28
-
39
+ @metrics = ['CREDENTIALS_PROCESS']
29
40
  super
30
41
  end
31
42
 
32
43
  private
33
- def credentials_from_process(proc_invocation)
34
- begin
35
- raw_out = `#{proc_invocation}`
36
- process_status = $?
37
- rescue Errno::ENOENT
38
- raise Errors::InvalidProcessCredentialsPayload.new("Could not find process #{proc_invocation}")
44
+
45
+ def credentials_from_process
46
+ r, w = IO.pipe
47
+ success = system(*@process, out: w)
48
+ w.close
49
+ raw_out = r.read
50
+ r.close
51
+
52
+ unless success
53
+ raise Errors::InvalidProcessCredentialsPayload.new(
54
+ 'credential_process provider failure, the credential process had '\
55
+ 'non zero exit status and failed to provide credentials'
56
+ )
39
57
  end
40
58
 
41
- if process_status.success?
42
- begin
43
- creds_json = Aws::Json.load(raw_out)
44
- rescue Aws::Json::ParseError
45
- raise Errors::InvalidProcessCredentialsPayload.new("Invalid JSON response")
46
- end
47
- payload_version = creds_json['Version']
48
- if payload_version == 1
49
- _parse_payload_format_v1(creds_json)
50
- else
51
- raise Errors::InvalidProcessCredentialsPayload.new("Invalid version #{payload_version} for credentials payload")
52
- end
53
- else
54
- raise Errors::InvalidProcessCredentialsPayload.new('credential_process provider failure, the credential process had non zero exit status and failed to provide credentials')
59
+ begin
60
+ creds_json = Aws::Json.load(raw_out)
61
+ rescue Aws::Json::ParseError
62
+ raise Errors::InvalidProcessCredentialsPayload.new('Invalid JSON response')
55
63
  end
64
+
65
+ payload_version = creds_json['Version']
66
+ return _parse_payload_format_v1(creds_json) if payload_version == 1
67
+
68
+ raise Errors::InvalidProcessCredentialsPayload.new(
69
+ "Invalid version #{payload_version} for credentials payload"
70
+ )
56
71
  end
57
72
 
58
73
  def _parse_payload_format_v1(creds_json)
59
74
  creds = Credentials.new(
60
75
  creds_json['AccessKeyId'],
61
76
  creds_json['SecretAccessKey'],
62
- creds_json['SessionToken']
77
+ creds_json['SessionToken'],
78
+ account_id: creds_json['AccountId']
63
79
  )
64
80
 
65
81
  @expiration = creds_json['Expiration'] ? Time.iso8601(creds_json['Expiration']) : nil
66
82
  return creds if creds.set?
67
- raise Errors::InvalidProcessCredentialsPayload.new("Invalid payload for JSON credentials version 1")
83
+
84
+ raise Errors::InvalidProcessCredentialsPayload.new(
85
+ 'Invalid payload for JSON credentials version 1'
86
+ )
68
87
  end
69
88
 
70
89
  def refresh
71
- @credentials = credentials_from_process(@process)
90
+ @credentials = credentials_from_process
72
91
  end
73
92
 
74
93
  def near_expiration?(expiration_length)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ # @api private
5
+ module Query
6
+ class EC2Handler < Aws::Query::Handler
7
+
8
+ def apply_params(param_list, params, rules)
9
+ Aws::Query::EC2ParamBuilder.new(param_list).apply(rules, params)
10
+ end
11
+
12
+ def parse_xml(context)
13
+ if (rules = context.operation.output)
14
+ parser = Xml::Parser.new(rules)
15
+ parser.parse(xml(context)) do |path, value|
16
+ if path.size == 2 && path.last == 'requestId'
17
+ context.metadata[:request_id] = value
18
+ end
19
+ end
20
+ else
21
+ EmptyStructure.new
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -31,13 +31,11 @@ module Aws
31
31
  end
32
32
 
33
33
  def list(ref, values, prefix)
34
- if values.empty?
35
- set(prefix, '')
36
- else
37
- member_ref = ref.shape.member
38
- values.each.with_index do |value, n|
39
- format(member_ref, value, "#{prefix}.#{n+1}")
40
- end
34
+ return if values.empty?
35
+
36
+ member_ref = ref.shape.member
37
+ values.each.with_index do |value, n|
38
+ format(member_ref, value, "#{prefix}.#{n + 1}")
41
39
  end
42
40
  end
43
41
 
@@ -27,13 +27,13 @@ module Aws
27
27
  # @return [Seahorse::Client::Response]
28
28
  def call(context)
29
29
  build_request(context)
30
- @handler.call(context).on_success do |response|
31
- response.error = nil
30
+ @handler.call(context).on_success do |resp|
31
+ resp.error = nil
32
32
  parsed = parse_xml(context)
33
33
  if parsed.nil? || parsed == EmptyStructure
34
- response.data = EmptyStructure.new
34
+ resp.data = EmptyStructure.new
35
35
  else
36
- response.data = parsed
36
+ resp.data = parsed
37
37
  end
38
38
  end
39
39
  end
@@ -36,7 +36,7 @@ module Aws
36
36
  return
37
37
  end
38
38
  if flat?(ref)
39
- if name = query_name(member_ref)
39
+ if (name = query_name(ref))
40
40
  parts = prefix.split('.')
41
41
  parts.pop
42
42
  parts.push(name)
@@ -82,7 +82,7 @@ module Aws
82
82
  end
83
83
 
84
84
  def flat?(ref)
85
- ref.shape.flattened
85
+ ref[:flattened] || ref.shape.flattened
86
86
  end
87
87
 
88
88
  def timestamp(ref, value)
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'query/ec2_param_builder'
4
3
  require_relative 'query/handler'
4
+ require_relative 'query/ec2_handler'
5
5
  require_relative 'query/param'
6
6
  require_relative 'query/param_builder'
7
+ require_relative 'query/ec2_param_builder'
7
8
  require_relative 'query/param_list'
@@ -1,30 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'thread'
4
-
5
3
  module Aws
6
-
7
4
  # Base class used credential classes that can be refreshed. This
8
5
  # provides basic refresh logic in a thread-safe manner. Classes mixing in
9
- # this module are expected to implement a #refresh method that populates
6
+ # this module are expected to implement a `#refresh` method that populates
10
7
  # the following instance variables:
11
8
  #
12
- # * `@access_key_id`
13
- # * `@secret_access_key`
14
- # * `@session_token`
15
- # * `@expiration`
9
+ # * `@credentials` ({Credentials})
10
+ # * `@expiration` (Time)
16
11
  #
17
- # @api private
18
12
  module RefreshingCredentials
19
-
20
13
  SYNC_EXPIRATION_LENGTH = 300 # 5 minutes
21
14
  ASYNC_EXPIRATION_LENGTH = 600 # 10 minutes
22
15
 
23
16
  CLIENT_EXCLUDE_OPTIONS = Set.new([:before_refresh]).freeze
24
17
 
18
+ # @param [Hash] options
19
+ # @option options [Proc] :before_refresh A Proc called before credentials are refreshed.
20
+ # It accepts `self` as the only argument.
25
21
  def initialize(options = {})
26
22
  @mutex = Mutex.new
27
- @before_refresh = options.delete(:before_refresh) if Hash === options
23
+ @before_refresh = options.delete(:before_refresh) if options.is_a?(Hash)
28
24
 
29
25
  @before_refresh.call(self) if @before_refresh
30
26
  refresh
@@ -36,12 +32,6 @@ module Aws
36
32
  @credentials
37
33
  end
38
34
 
39
- # @return [Time,nil]
40
- def expiration
41
- refresh_if_near_expiration!
42
- @expiration
43
- end
44
-
45
35
  # Refresh credentials.
46
36
  # @return [void]
47
37
  def refresh!
@@ -54,26 +44,34 @@ module Aws
54
44
 
55
45
  private
56
46
 
47
+ def sync_expiration_length
48
+ self.class::SYNC_EXPIRATION_LENGTH
49
+ end
50
+
51
+ def async_expiration_length
52
+ self.class::ASYNC_EXPIRATION_LENGTH
53
+ end
54
+
57
55
  # Refreshes credentials asynchronously and synchronously.
58
56
  # If we are near to expiration, block while getting new credentials.
59
57
  # Otherwise, if we're approaching expiration, use the existing credentials
60
58
  # but attempt a refresh in the background.
61
59
  def refresh_if_near_expiration!
62
- # Note: This check is an optimization. Rather than acquire the mutex on every #refresh_if_near_expiration
60
+ # NOTE: This check is an optimization. Rather than acquire the mutex on every #refresh_if_near_expiration
63
61
  # call, we check before doing so, and then we check within the mutex to avoid a race condition.
64
62
  # See issue: https://github.com/aws/aws-sdk-ruby/issues/2641 for more info.
65
- if near_expiration?(SYNC_EXPIRATION_LENGTH)
63
+ if near_expiration?(sync_expiration_length)
66
64
  @mutex.synchronize do
67
- if near_expiration?(SYNC_EXPIRATION_LENGTH)
65
+ if near_expiration?(sync_expiration_length)
68
66
  @before_refresh.call(self) if @before_refresh
69
67
  refresh
70
68
  end
71
69
  end
72
- elsif @async_refresh && near_expiration?(ASYNC_EXPIRATION_LENGTH)
70
+ elsif @async_refresh && near_expiration?(async_expiration_length)
73
71
  unless @mutex.locked?
74
72
  Thread.new do
75
73
  @mutex.synchronize do
76
- if near_expiration?(ASYNC_EXPIRATION_LENGTH)
74
+ if near_expiration?(async_expiration_length)
77
75
  @before_refresh.call(self) if @before_refresh
78
76
  refresh
79
77
  end
@@ -91,6 +89,5 @@ module Aws
91
89
  true
92
90
  end
93
91
  end
94
-
95
92
  end
96
93
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ # setup autoloading for Resources module
5
+ module Resources
6
+ autoload :Collection, 'aws-sdk-core/resources/collection'
7
+ end
8
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module Rest
5
+ # NOTE: headers could be already populated if specified on input shape
6
+ class ContentTypeHandler < Seahorse::Client::Handler
7
+ def call(context)
8
+ if eventstream?(context)
9
+ context.http_request.headers['Content-Type'] ||=
10
+ 'application/vnd.amazon.eventstream'
11
+ elsif (payload = context.operation.input[:payload_member])
12
+ case payload.shape
13
+ when Seahorse::Model::Shapes::BlobShape
14
+ context.http_request.headers['Content-Type'] ||=
15
+ 'application/octet-stream'
16
+ when Seahorse::Model::Shapes::StringShape
17
+ context.http_request.headers['Content-Type'] ||=
18
+ 'text/plain'
19
+ else
20
+ apply_default_content_type(context)
21
+ end
22
+ elsif (body = context.http_request.body) &&
23
+ (!body.respond_to?(:size) || non_empty_body?(body))
24
+ apply_default_content_type(context)
25
+ end
26
+
27
+ @handler.call(context)
28
+ end
29
+
30
+ private
31
+
32
+ def non_empty_body?(body)
33
+ body.respond_to?(:size) && body.size.positive?
34
+ end
35
+
36
+ def eventstream?(context)
37
+ context.operation.input.shape.members.each do |_, ref|
38
+ return true if ref.eventstream
39
+ end
40
+ false
41
+ end
42
+
43
+ # content-type defaults as noted here:
44
+ # rest-json: https://smithy.io/2.0/aws/protocols/aws-restxml-protocol.html#content-type
45
+ # rest-xml: https://smithy.io/2.0/aws/protocols/aws-restxml-protocol.html#content-type
46
+ def apply_default_content_type(context)
47
+ protocol = context.config.api.metadata['protocol']
48
+ case protocol
49
+ when 'rest-json'
50
+ context.http_request.headers['Content-Type'] ||=
51
+ 'application/json'
52
+ when 'rest-xml'
53
+ context.http_request.headers['Content-Type'] ||=
54
+ 'application/xml'
55
+ else raise "Unsupported protocol #{protocol}"
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -7,10 +7,9 @@ module Aws
7
7
 
8
8
  def call(context)
9
9
  Rest::Request::Builder.new.apply(context)
10
- resp = @handler.call(context)
11
- resp.on(200..299) { |response| Response::Parser.new.apply(response) }
12
- resp.on(200..599) { |response| apply_request_id(context) }
13
- resp
10
+ response = @handler.call(context)
11
+ response.on(200..299) { |resp| Response::Parser.new.apply(resp) }
12
+ response.on(200..599) { |_resp| apply_request_id(context) }
14
13
  end
15
14
 
16
15
  private
@@ -18,10 +18,13 @@ module Aws
18
18
  # @param [Hash] params
19
19
  def apply(http_req, params)
20
20
  body = build_body(params)
21
+
21
22
  # for rest-json, ensure we send at least an empty object
22
23
  # don't send an empty object for streaming? case.
23
- if body.nil? && @serializer_class == Json::Builder &&
24
- modeled_body? && !streaming?
24
+ if body.nil? &&
25
+ json_builder? &&
26
+ modeled_body? &&
27
+ !streaming?
25
28
  body = '{}'
26
29
  end
27
30
  http_req.body = body
@@ -45,13 +48,29 @@ module Aws
45
48
  params[@rules[:payload]]
46
49
  elsif @rules[:payload]
47
50
  params = params[@rules[:payload]]
48
- serialize(@rules[:payload_member], params) if params
51
+ if params
52
+ if xml_builder? &&
53
+ @rules.shape.member?(@rules[:payload_member].location_name)
54
+ # serializing payload member name for rest-xml is as follows:
55
+ # 1. Use the member locationName if the member value doesn't match the member's name (default)
56
+ # 2. Use the value of the locationName on the member's target if present
57
+ # 3. Use the shape name of the member's target
58
+ serialize(@rules[:payload_member], params, location_name: payload_location_name)
59
+ else
60
+ serialize(@rules[:payload_member], params)
61
+ end
62
+ end
49
63
  else
50
64
  params = body_params(params)
51
65
  serialize(@rules, params) unless params.empty?
52
66
  end
53
67
  end
54
68
 
69
+ def payload_location_name
70
+ @rules[:payload_member].shape['locationName'] ||
71
+ @rules[:payload_member].shape.name
72
+ end
73
+
55
74
  def streaming?
56
75
  @rules[:payload] && (
57
76
  BlobShape === @rules[:payload_member].shape ||
@@ -59,8 +78,16 @@ module Aws
59
78
  )
60
79
  end
61
80
 
62
- def serialize(rules, params)
63
- @serializer_class.new(rules).serialize(params)
81
+ def xml_builder?
82
+ @serializer_class == Xml::Builder
83
+ end
84
+
85
+ def json_builder?
86
+ @serializer_class == Json::Builder
87
+ end
88
+
89
+ def serialize(rules, params, location_name: nil)
90
+ @serializer_class.new(rules, location_name: location_name).serialize(params)
64
91
  end
65
92
 
66
93
  def body_params(params)
@@ -30,7 +30,9 @@ module Aws
30
30
  private
31
31
 
32
32
  def apply_path_params(uri, params)
33
- path = uri.path.sub(/\/$/, '') + @path_pattern.split('?')[0]
33
+ path = uri.path.sub(%r{/$}, '')
34
+ # handle trailing slash
35
+ path += @path_pattern.split('?')[0] if path.empty? || @path_pattern != '/'
34
36
  uri.path = path.gsub(/{.+?}/) do |placeholder|
35
37
  param_value_for_placeholder(placeholder, params)
36
38
  end
@@ -38,22 +40,40 @@ module Aws
38
40
 
39
41
  def param_value_for_placeholder(placeholder, params)
40
42
  name = param_name(placeholder)
41
- value = params[name].to_s
43
+ param_shape = @rules.shape.member(name).shape
44
+ value =
45
+ case param_shape
46
+ when Seahorse::Model::Shapes::TimestampShape
47
+ timestamp(param_shape, params[name]).to_s
48
+ else
49
+ params[name].to_s
50
+ end
51
+
42
52
  raise ArgumentError, ":#{name} must not be blank" if value.empty?
43
53
 
44
54
  if placeholder.include?('+')
45
- value.gsub(/[^\/]+/) { |v| escape(v) }
55
+ value.gsub(%r{[^/]+}) { |v| escape(v) }
46
56
  else
47
57
  escape(value)
48
58
  end
49
59
  end
50
60
 
51
61
  def param_name(placeholder)
52
- location_name = placeholder.gsub(/[{}+]/,'')
62
+ location_name = placeholder.gsub(/[{}+]/, '')
53
63
  param_name, _ = @rules.shape.member_by_location_name(location_name)
54
64
  param_name
55
65
  end
56
66
 
67
+ def timestamp(ref, value)
68
+ case ref['timestampFormat']
69
+ when 'unixTimestamp' then value.to_i
70
+ when 'rfc822' then value.utc.httpdate
71
+ else
72
+ # serializing as RFC 3399 date-time is the default
73
+ value.utc.iso8601
74
+ end
75
+ end
76
+
57
77
  def apply_querystring_params(uri, params)
58
78
  # collect params that are supposed to be part of the query string
59
79
  parts = @rules.shape.members.inject([]) do |prts, (member_name, member_ref)|
@@ -21,6 +21,7 @@ module Aws
21
21
  @rules.shape.members.each do |name, ref|
22
22
  value = params[name]
23
23
  next if value.nil?
24
+
24
25
  case ref.location
25
26
  when 'header' then apply_header_value(http_req.headers, ref, value)
26
27
  when 'headers' then apply_header_map(http_req.headers, ref, value)
@@ -49,18 +50,25 @@ module Aws
49
50
  end
50
51
  end
51
52
 
52
- def list(headers, ref, value)
53
- return if !value || value.empty?
54
- headers[ref.location_name] = value
55
- .compact
56
- .map { |s| Seahorse::Util.escape_header_list_string(s.to_s) }
57
- .join(',')
53
+ def list(headers, ref, values)
54
+ return if values.nil?
55
+
56
+ member_ref = ref.shape.member
57
+ values = values.collect do |value|
58
+ case member_ref.shape
59
+ when TimestampShape
60
+ timestamp(member_ref, value).to_s
61
+ else
62
+ Seahorse::Util.escape_header_list_string(value.to_s)
63
+ end
64
+ end
65
+ headers[ref.location_name] = values.compact.join(', ')
58
66
  end
59
67
 
60
68
  def apply_header_map(headers, ref, values)
61
69
  prefix = ref.location_name || ''
62
70
  values.each_pair do |name, value|
63
- headers["#{prefix}#{name}"] = value.to_s
71
+ headers["#{prefix}#{name}"] ||= value.to_s
64
72
  end
65
73
  end
66
74