aws-sdk-core 3.39.0 → 3.54.2

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/aws-sdk-core/async_client_stubs.rb +80 -0
  4. data/lib/aws-sdk-core/binary/decode_handler.rb +9 -1
  5. data/lib/aws-sdk-core/binary/encode_handler.rb +32 -0
  6. data/lib/aws-sdk-core/binary/event_builder.rb +122 -0
  7. data/lib/aws-sdk-core/binary/event_parser.rb +48 -18
  8. data/lib/aws-sdk-core/binary/event_stream_decoder.rb +5 -2
  9. data/lib/aws-sdk-core/binary/event_stream_encoder.rb +53 -0
  10. data/lib/aws-sdk-core/binary.rb +3 -0
  11. data/lib/aws-sdk-core/client_side_monitoring/request_metrics.rb +63 -9
  12. data/lib/aws-sdk-core/client_stubs.rb +1 -1
  13. data/lib/aws-sdk-core/ecs_credentials.rb +12 -8
  14. data/lib/aws-sdk-core/errors.rb +38 -2
  15. data/lib/aws-sdk-core/event_emitter.rb +42 -0
  16. data/lib/aws-sdk-core/instance_profile_credentials.rb +12 -8
  17. data/lib/aws-sdk-core/json/error_handler.rb +19 -2
  18. data/lib/aws-sdk-core/json/handler.rb +19 -1
  19. data/lib/aws-sdk-core/log/param_filter.rb +1 -1
  20. data/lib/aws-sdk-core/param_validator.rb +9 -1
  21. data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +22 -3
  22. data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +5 -1
  23. data/lib/aws-sdk-core/plugins/event_stream_configuration.rb +14 -0
  24. data/lib/aws-sdk-core/plugins/invocation_id.rb +33 -0
  25. data/lib/aws-sdk-core/plugins/retry_errors.rb +2 -0
  26. data/lib/aws-sdk-core/plugins/stub_responses.rb +19 -7
  27. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +53 -0
  28. data/lib/aws-sdk-core/plugins/user_agent.rb +6 -0
  29. data/lib/aws-sdk-core/process_credentials.rb +7 -1
  30. data/lib/aws-sdk-core/query/handler.rb +6 -1
  31. data/lib/aws-sdk-core/refreshing_credentials.rb +1 -1
  32. data/lib/aws-sdk-core/resources/collection.rb +1 -1
  33. data/lib/aws-sdk-core/structure.rb +6 -2
  34. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +19 -0
  35. data/lib/aws-sdk-core/stubbing/stub_data.rb +13 -4
  36. data/lib/aws-sdk-core/waiters/waiter.rb +2 -2
  37. data/lib/aws-sdk-core/xml/error_handler.rb +26 -3
  38. data/lib/aws-sdk-core.rb +1 -0
  39. data/lib/aws-sdk-sts/client.rb +622 -427
  40. data/lib/aws-sdk-sts/client_api.rb +35 -0
  41. data/lib/aws-sdk-sts/errors.rb +128 -0
  42. data/lib/aws-sdk-sts/types.rb +498 -165
  43. data/lib/aws-sdk-sts.rb +1 -1
  44. data/lib/seahorse/client/async_base.rb +50 -0
  45. data/lib/seahorse/client/async_response.rb +62 -0
  46. data/lib/seahorse/client/base.rb +1 -1
  47. data/lib/seahorse/client/configuration.rb +4 -2
  48. data/lib/seahorse/client/events.rb +1 -1
  49. data/lib/seahorse/client/h2/connection.rb +244 -0
  50. data/lib/seahorse/client/h2/handler.rb +151 -0
  51. data/lib/seahorse/client/http/async_response.rb +42 -0
  52. data/lib/seahorse/client/http/response.rb +13 -8
  53. data/lib/seahorse/client/net_http/patches.rb +7 -1
  54. data/lib/seahorse/client/networking_error.rb +28 -0
  55. data/lib/seahorse/client/plugin.rb +1 -1
  56. data/lib/seahorse/client/plugins/content_length.rb +7 -2
  57. data/lib/seahorse/client/plugins/h2.rb +64 -0
  58. data/lib/seahorse/model/api.rb +4 -0
  59. data/lib/seahorse/model/operation.rb +4 -0
  60. data/lib/seahorse/model/shapes.rb +2 -2
  61. data/lib/seahorse.rb +9 -0
  62. metadata +23 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 170c5072c882998ecf8c01d181d0c4d987101463
4
- data.tar.gz: 71a98bb06e800d2bc77866e322330944a5e7417b
3
+ metadata.gz: 957c22992e76e2f143a965bd0ec0b377f9ad95ac
4
+ data.tar.gz: a2aae223f15b9a3d0df478ce8eabd8b8a48136b8
5
5
  SHA512:
6
- metadata.gz: 2dc2097e0b07c58e0ca5154970be40eb0d02e1b5bc413b92974aa58683dedecf8adea762c58f29be16b7bca31704c1973e30c3991f554e79bf209992c06a5f11
7
- data.tar.gz: 86492dd225866778c8045ede1bd9a6a5b0bc6fe4b49be1016469583f2a0f738c3e37186ec02f4c5ba521072b755e54928b1a7ef375a6e165cf7a645383be57de
6
+ metadata.gz: e35f246d2a7ffa5789ec88035a55e4b6def9e99322f9560b53d70c21acfd34b11a6f0e248d8063af33e4d59a4c1a50f905d84434c35c99873b6093a4da9c64bb
7
+ data.tar.gz: 6e1ad990cd9343153d41a8f92f8f4801eb703504e4ec23da383496ebc2d994f448f85a30b11ad5726946bbbc7f2512897e569c3efc9383af672b998c2b925377
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.39.0
1
+ 3.54.2
@@ -0,0 +1,80 @@
1
+ module Aws
2
+ module AsyncClientStubs
3
+
4
+ include Aws::ClientStubs
5
+
6
+ # @api private
7
+ def setup_stubbing
8
+ @stubs = {}
9
+ @stub_mutex = Mutex.new
10
+ if Hash === @config.stub_responses
11
+ @config.stub_responses.each do |operation_name, stubs|
12
+ apply_stubs(operation_name, Array === stubs ? stubs : [stubs])
13
+ end
14
+ end
15
+
16
+ # When a client is stubbed allow the user to access the requests made
17
+ @api_requests = []
18
+
19
+ # allow to access signaled events when client is stubbed
20
+ @send_events = []
21
+
22
+ requests = @api_requests
23
+ send_events = @send_events
24
+
25
+ self.handle do |context|
26
+ if input_stream = context[:input_event_stream_handler]
27
+ stub_stream = StubStream.new
28
+ stub_stream.send_events = send_events
29
+ input_stream.event_emitter.stream = stub_stream
30
+ input_stream.event_emitter.validate_event = context.config.validate_params
31
+ end
32
+ requests << {
33
+ operation_name: context.operation_name,
34
+ params: context.params,
35
+ context: context
36
+ }
37
+ @handler.call(context)
38
+ end
39
+ end
40
+
41
+ def send_events
42
+ if config.stub_responses
43
+ @send_events
44
+ else
45
+ msg = 'This method is only implemented for stubbed clients, and is '
46
+ msg << 'available when you enable stubbing in the constructor with `stub_responses: true`'
47
+ raise NotImplementedError.new(msg)
48
+ end
49
+ end
50
+
51
+ class StubStream
52
+
53
+ def initialize
54
+ @state = :open
55
+ end
56
+
57
+ attr_accessor :send_events
58
+
59
+ attr_reader :state
60
+
61
+ def data(bytes, options = {})
62
+ if options[:end_stream]
63
+ @state = :closed
64
+ else
65
+ decoder = Aws::EventStream::Decoder.new
66
+ event = decoder.decode_chunk(bytes).first
67
+ @send_events << decoder.decode_chunk(event.payload.read).first
68
+ end
69
+ end
70
+
71
+ def closed?
72
+ @state == :closed
73
+ end
74
+
75
+ def close
76
+ @state = :closed
77
+ end
78
+ end
79
+ end
80
+ end
@@ -23,11 +23,19 @@ module Aws
23
23
 
24
24
  context.http_response.on_headers(200) do
25
25
  protocol = context.config.api.metadata['protocol']
26
+ output_handler = context[:output_event_stream_handler] || context[:event_stream_handler]
26
27
  context.http_response.body = EventStreamDecoder.new(
27
28
  protocol,
28
29
  rules,
30
+ context.operation.output,
31
+ context.operation.errors,
29
32
  context.http_response.body,
30
- context[:event_stream_handler])
33
+ output_handler)
34
+ if input_emitter = context[:input_event_emitter]
35
+ # #emit will be blocked until 200 success
36
+ # see Aws::EventEmitter#emit
37
+ input_emitter.signal_queue << "ready"
38
+ end
31
39
  end
32
40
 
33
41
  context.http_response.on_success(200) do
@@ -0,0 +1,32 @@
1
+ module Aws
2
+ module Binary
3
+
4
+ # @api private
5
+ class EncodeHandler < Seahorse::Client::Handler
6
+
7
+ def call(context)
8
+ if eventstream_member = eventstream_input?(context)
9
+ input_es_handler = context[:input_event_stream_handler]
10
+ input_es_handler.event_emitter.encoder = EventStreamEncoder.new(
11
+ context.config.api.metadata['protocol'],
12
+ eventstream_member,
13
+ context.operation.input,
14
+ context.config.sigv4_signer
15
+ )
16
+ context[:input_event_emitter] = input_es_handler.event_emitter
17
+ end
18
+ @handler.call(context)
19
+ end
20
+
21
+ private
22
+
23
+ def eventstream_input?(ctx)
24
+ ctx.operation.input.shape.members.each do |_, ref|
25
+ return ref if ref.eventstream
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,122 @@
1
+ module Aws
2
+ module Binary
3
+ # @api private
4
+ class EventBuilder
5
+
6
+ include Seahorse::Model::Shapes
7
+
8
+ # @param [Class] parser_class
9
+ # @param [Seahorse::Model::ShapeRef] rules (of eventstream member)
10
+ def initialize(serializer_class, rules)
11
+ @serializer_class = serializer_class
12
+ @rules = rules
13
+ end
14
+
15
+ def apply(event_type, params)
16
+ event_ref = @rules.shape.member(event_type)
17
+ _event_stream_message(event_ref, params)
18
+ end
19
+
20
+ private
21
+
22
+ def _event_stream_message(event_ref, params)
23
+ es_headers = {}
24
+ payload = ""
25
+
26
+ es_headers[":message-type"] = Aws::EventStream::HeaderValue.new(
27
+ type: "string", value: "event")
28
+ es_headers[":event-type"] = Aws::EventStream::HeaderValue.new(
29
+ type: "string", value: event_ref.location_name)
30
+
31
+ explicit_payload = false
32
+ implicit_payload_members = {}
33
+ event_ref.shape.members.each do |member_name, member_ref|
34
+ unless member_ref.eventheader
35
+ if member_ref.eventpayload
36
+ explicit_payload = true
37
+ else
38
+ implicit_payload_members[member_name] = member_ref
39
+ end
40
+ end
41
+ end
42
+
43
+ # implict payload
44
+ if !explicit_payload && !implicit_payload_members.empty?
45
+ if implicit_payload_members.size > 1
46
+ payload_shape = Shapes::StructureShape.new
47
+ implicit_payload_members.each do |m_name, m_ref|
48
+ payload_shape.add_member(m_name, m_ref)
49
+ end
50
+ payload_ref = Shapes::ShapeRef.new(shape: payload_shape)
51
+
52
+ payload = build_payload_members(payload_ref, params)
53
+ else
54
+ m_name, m_ref = implicit_payload_members.first
55
+ streaming, content_type = _content_type(m_ref.shape)
56
+
57
+ es_headers[":content-type"] = Aws::EventStream::HeaderValue.new(
58
+ type: "string", value: content_type)
59
+ payload = _build_payload(streaming, m_ref, params[m_name])
60
+ end
61
+ end
62
+
63
+
64
+ event_ref.shape.members.each do |member_name, member_ref|
65
+ if member_ref.eventheader && params[member_name]
66
+ header_value = params[member_name]
67
+ es_headers[member_ref.shape.name] = Aws::EventStream::HeaderValue.new(
68
+ type: _header_value_type(member_ref.shape, header_value),
69
+ value: header_value
70
+ )
71
+ elsif member_ref.eventpayload && params[member_name]
72
+ # explicit payload
73
+ streaming, content_type = _content_type(member_ref.shape)
74
+
75
+ es_headers[":content-type"] = Aws::EventStream::HeaderValue.new(
76
+ type: "string", value: content_type)
77
+ payload = _build_payload(streaming, member_ref, params[member_name])
78
+ end
79
+ end
80
+
81
+ Aws::EventStream::Message.new(
82
+ headers: es_headers,
83
+ payload: StringIO.new(payload)
84
+ )
85
+ end
86
+
87
+ def _content_type(shape)
88
+ case shape
89
+ when BlobShape then [true, "application/octet-stream"]
90
+ when StringShape then [true, "text/plain"]
91
+ when StructureShape then
92
+ if @serializer_class.name.include?('Xml')
93
+ [false, "text/xml"]
94
+ elsif @serializer_class.name.include?('Json')
95
+ [false, "application/json"]
96
+ end
97
+ else
98
+ raise Aws::Errors::EventStreamBuilderError.new(
99
+ "Unsupport eventpayload shape: #{shape.name}")
100
+ end
101
+ end
102
+
103
+ def _header_value_type(shape, value)
104
+ case shape
105
+ when StringShape then "string"
106
+ when IntegerShape then "integer"
107
+ when TimestampShape then "timestamp"
108
+ when BlobShape then "bytes"
109
+ when BooleanShape then !!value ? "bool_true" : "bool_false"
110
+ else
111
+ raise Aws::Errors::EventStreamBuilderError.new(
112
+ "Unsupported eventheader shape: #{shape.name}")
113
+ end
114
+ end
115
+
116
+ def _build_payload(streaming, ref, value)
117
+ streaming ? value : @serializer_class.new(ref).serialize(value)
118
+ end
119
+
120
+ end
121
+ end
122
+ end
@@ -6,10 +6,14 @@ module Aws
6
6
  include Seahorse::Model::Shapes
7
7
 
8
8
  # @param [Class] parser_class
9
- # @param [Seahorse::Model::ShapeRef] rules
10
- def initialize(parser_class, rules)
9
+ # @param [Seahorse::Model::ShapeRef] rules (of eventstream member)
10
+ # @param [Array] error_refs array of errors ShapeRef
11
+ # @param [Seahorse::Model::ShapeRef] output_ref
12
+ def initialize(parser_class, rules, error_refs, output_ref)
11
13
  @parser_class = parser_class
12
14
  @rules = rules
15
+ @error_refs = error_refs
16
+ @output_ref = output_ref
13
17
  end
14
18
 
15
19
  # Parse raw event message into event struct
@@ -31,9 +35,7 @@ module Aws
31
35
  when 'event'
32
36
  parse_event(raw_event)
33
37
  when 'exception'
34
- # Pending
35
- raise Aws::Errors::EventStreamParserError.new(
36
- ':exception event parsing is not supported')
38
+ parse_exception(raw_event)
37
39
  else
38
40
  raise Aws::Errors::EventStreamParserError.new(
39
41
  'Unrecognized :message-type value for the event')
@@ -44,6 +46,15 @@ module Aws
44
46
  end
45
47
  end
46
48
 
49
+ def parse_exception(raw_event)
50
+ exception_type = raw_event.headers.delete(":exception-type").value
51
+ name, ref = @rules.shape.member_by_location_name(exception_type)
52
+ # exception lives in payload implictly
53
+ exception = parse_payload(raw_event.payload.read, ref)
54
+ exception.event_type = name
55
+ exception
56
+ end
57
+
47
58
  def parse_error_event(raw_event)
48
59
  error_code = raw_event.headers.delete(":error-code")
49
60
  error_message = raw_event.headers.delete(":error-message")
@@ -58,35 +69,54 @@ module Aws
58
69
  event_type = raw_event.headers.delete(":event-type").value
59
70
  # content_type = raw_event.headers.delete(":content-type").value
60
71
 
61
- # Pending
62
72
  if event_type == 'initial-response'
63
- raise Aws::Errors::EventStreamParserError.new(
64
- 'non eventstream member at response is not supported yet'
65
- )
73
+ event = Struct.new(:event_type, :response).new
74
+ event.event_type = :initial_response
75
+ event.response = parse_payload(raw_event.payload.read, @output_ref)
76
+ return event
66
77
  end
67
78
 
68
79
  # locate event from eventstream
69
80
  name, ref = @rules.shape.member_by_location_name(event_type)
70
- raise "Non event member found at eventstream" unless ref.event
81
+ unless ref.event
82
+ raise Aws::Errors::EventStreamParserError.new(
83
+ "Failed to locate event shape for the event")
84
+ end
71
85
 
72
86
  event = ref.shape.struct_class.new
87
+
88
+ explicit_payload = false
89
+ implicit_payload_members = {}
90
+ ref.shape.members.each do |member_name, member_ref|
91
+ unless member_ref.eventheader
92
+ if member_ref.eventpayload
93
+ explicit_payload = true
94
+ else
95
+ implicit_payload_members[member_name] = member_ref
96
+ end
97
+ end
98
+ end
99
+
100
+ # implicit payload
101
+ if !explicit_payload && !implicit_payload_members.empty?
102
+ event = parse_payload(raw_event.payload.read, ref)
103
+ end
73
104
  event.event_type = name
105
+
74
106
  # locate payload and headers in the event
75
107
  ref.shape.members.each do |member_name, member_ref|
76
- if member_ref.eventpayload
77
- eventpayload_streaming?(member_ref) ?
78
- event.send("#{member_name}=", raw_event.payload) :
79
- event.send("#{member_name}=", parse_payload(raw_event.payload.read, member_ref))
80
- elsif member_ref.eventheader
108
+ if member_ref.eventheader
81
109
  # allow incomplete event members in response
82
110
  if raw_event.headers.key?(member_ref.location_name)
83
111
  event.send("#{member_name}=", raw_event.headers[member_ref.location_name].value)
84
112
  end
85
- else
86
- raise "Non eventpayload or eventheader member found at event"
113
+ elsif member_ref.eventpayload
114
+ # explicit payload
115
+ eventpayload_streaming?(member_ref) ?
116
+ event.send("#{member_name}=", raw_event.payload) :
117
+ event.send("#{member_name}=", parse_payload(raw_event.payload.read, member_ref))
87
118
  end
88
119
  end
89
-
90
120
  event
91
121
  end
92
122
 
@@ -7,11 +7,13 @@ module Aws
7
7
 
8
8
  # @param [String] protocol
9
9
  # @param [ShapeRef] rules ShapeRef of the eventstream member
10
+ # @param [ShapeRef] output_ref ShapeRef of output shape
11
+ # @param [Array] error_refs array of ShapeRefs for errors
10
12
  # @param [EventStream|nil] event_stream_handler A Service EventStream object
11
13
  # that registered with callbacks for processing events when they arrive
12
- def initialize(protocol, rules, io, event_stream_handler = nil)
14
+ def initialize(protocol, rules, output_ref, error_refs, io, event_stream_handler = nil)
13
15
  @decoder = Aws::EventStream::Decoder.new
14
- @event_parser = EventParser.new(parser_class(protocol), rules)
16
+ @event_parser = EventParser.new(parser_class(protocol), rules, error_refs, output_ref)
15
17
  @stream_class = extract_stream_class(rules.shape.struct_class)
16
18
  @emitter = event_stream_handler.event_emitter
17
19
  @events = []
@@ -42,6 +44,7 @@ module Aws
42
44
  case protocol
43
45
  when 'rest-xml' then Aws::Xml::Parser
44
46
  when 'rest-json' then Aws::Json::Parser
47
+ when 'json' then Aws::Json::Parser
45
48
  else raise "unsupported protocol #{protocol} for event stream"
46
49
  end
47
50
  end
@@ -0,0 +1,53 @@
1
+ require 'aws-eventstream'
2
+
3
+ module Aws
4
+ module Binary
5
+ # @api private
6
+ class EventStreamEncoder
7
+
8
+ # @param [String] protocol
9
+ # @param [ShapeRef] rules ShapeRef of the eventstream member
10
+ # @param [ShapeRef] input_ref ShapeRef of the input shape
11
+ # @param [Aws::Sigv4::Signer] signer
12
+ def initialize(protocol, rules, input_ref, signer)
13
+ @encoder = Aws::EventStream::Encoder.new
14
+ @event_builder = EventBuilder.new(serializer_class(protocol), rules)
15
+ @input_ref = input_ref
16
+ @rules = rules
17
+ @signer = signer
18
+ @prior_signature = nil
19
+ end
20
+
21
+ attr_reader :rules
22
+
23
+ attr_accessor :prior_signature
24
+
25
+ def encode(event_type, params)
26
+ if event_type == :end_stream
27
+ payload = ''
28
+ else
29
+ payload = @encoder.encode(@event_builder.apply(event_type, params))
30
+ end
31
+ headers, signature = @signer.sign_event(@prior_signature, payload, @encoder)
32
+ @prior_signature = signature
33
+ message = Aws::EventStream::Message.new(
34
+ headers: headers,
35
+ payload: StringIO.new(payload)
36
+ )
37
+ @encoder.encode(message)
38
+ end
39
+
40
+ private
41
+
42
+ def serializer_class(protocol)
43
+ case protocol
44
+ when 'rest-xml' then Xml::Builder
45
+ when 'rest-json' then Json::Builder
46
+ when 'json' then Json::Builder
47
+ else raise "unsupported protocol #{protocol} for event stream"
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,6 @@
1
1
  require_relative 'binary/decode_handler'
2
+ require_relative 'binary/encode_handler'
2
3
  require_relative 'binary/event_stream_decoder'
4
+ require_relative 'binary/event_stream_encoder'
5
+ require_relative 'binary/event_builder'
3
6
  require_relative 'binary/event_parser'
@@ -4,6 +4,19 @@ module Aws
4
4
  class RequestMetrics
5
5
  attr_reader :api_call, :api_call_attempts
6
6
 
7
+ FIELD_MAX_LENGTH = {
8
+ "ClientId" => 255,
9
+ "UserAgent" => 256,
10
+ "SdkException" => 128,
11
+ "SdkExceptionMessage" => 512,
12
+ "AwsException" => 128,
13
+ "AwsExceptionMessage" => 512,
14
+ "FinalAwsException" => 128,
15
+ "FinalAwsExceptionMessage" => 512,
16
+ "FinalSdkException" => 128,
17
+ "FinalSdkExceptionMessage" => 512,
18
+ }
19
+
7
20
  def initialize(opts = {})
8
21
  @service = opts[:service]
9
22
  @api = opts[:operation]
@@ -42,7 +55,10 @@ module Aws
42
55
 
43
56
  class ApiCall
44
57
  attr_reader :service, :api, :client_id, :timestamp, :version,
45
- :attempt_count, :latency, :region, :max_retries_exceeded
58
+ :attempt_count, :latency, :region, :max_retries_exceeded,
59
+ :final_http_status_code, :user_agent, :final_aws_exception,
60
+ :final_aws_exception_message, :final_sdk_exception,
61
+ :final_sdk_exception_message
46
62
 
47
63
  def initialize(service, api, client_id, version, timestamp, region)
48
64
  @service = service
@@ -56,15 +72,22 @@ module Aws
56
72
  def complete(opts = {})
57
73
  @latency = opts[:latency]
58
74
  @attempt_count = opts[:attempt_count]
75
+ @user_agent = opts[:user_agent]
59
76
  if opts[:final_error_retryable]
60
77
  @max_retries_exceeded = 1
61
78
  else
62
79
  @max_retries_exceeded = 0
63
80
  end
81
+ @final_http_status_code = opts[:final_http_status_code]
82
+ @final_aws_exception = opts[:final_aws_exception]
83
+ @final_aws_exception_message = opts[:final_aws_exception_message]
84
+ @final_sdk_exception = opts[:final_sdk_exception]
85
+ @final_sdk_exception_message = opts[:final_sdk_exception_message]
86
+ @region = opts[:region] if opts[:region] # in case region changes
64
87
  end
65
88
 
66
89
  def to_json(*a)
67
- {
90
+ document = {
68
91
  "Type" => "ApiCall",
69
92
  "Service" => @service,
70
93
  "Api" => @api,
@@ -74,17 +97,36 @@ module Aws
74
97
  "AttemptCount" => @attempt_count,
75
98
  "Latency" => @latency,
76
99
  "Region" => @region,
77
- "MaxRetriesExceeded" => @max_retries_exceeded
78
- }.to_json
100
+ "MaxRetriesExceeded" => @max_retries_exceeded,
101
+ "UserAgent" => @user_agent,
102
+ "FinalHttpStatusCode" => @final_http_status_code,
103
+ }
104
+ document["FinalSdkException"] = @final_sdk_exception if @final_sdk_exception
105
+ document["FinalSdkExceptionMessage"] = @final_sdk_exception_message if @final_sdk_exception_message
106
+ document["FinalAwsException"] = @final_aws_exception if @final_aws_exception
107
+ document["FinalAwsExceptionMessage"] = @final_aws_exception_message if @final_aws_exception_message
108
+ document = _truncate(document)
109
+ document.to_json
110
+ end
111
+
112
+ private
113
+ def _truncate(document)
114
+ document.each do |key, value|
115
+ limit = FIELD_MAX_LENGTH[key]
116
+ if limit && value.to_s.length > limit
117
+ document[key] = value.to_s.slice(0...limit)
118
+ end
119
+ end
120
+ document
79
121
  end
80
122
  end
81
123
 
82
124
  class ApiCallAttempt
83
- attr_reader :service, :api, :client_id, :version, :timestamp, :fqdn,
84
- :region, :user_agent, :access_key, :session_token
85
- attr_accessor :request_latency, :http_status_code, :aws_exception_msg,
86
- :x_amz_request_id, :x_amz_id_2, :x_amzn_request_id, :sdk_exception,
87
- :aws_exception, :sdk_exception_msg
125
+ attr_reader :service, :api, :client_id, :version, :timestamp,
126
+ :user_agent, :access_key, :session_token
127
+ attr_accessor :region, :fqdn, :request_latency, :http_status_code,
128
+ :aws_exception_msg, :x_amz_request_id, :x_amz_id_2,
129
+ :x_amzn_request_id, :sdk_exception, :aws_exception, :sdk_exception_msg
88
130
 
89
131
  def initialize(
90
132
  service,
@@ -134,8 +176,20 @@ module Aws
134
176
  json["AttemptLatency"] = @request_latency if @request_latency
135
177
  json["SdkException"] = @sdk_exception if @sdk_exception
136
178
  json["SdkExceptionMessage"] = @sdk_exception_msg if @sdk_exception_msg
179
+ json = _truncate(json)
137
180
  json.to_json
138
181
  end
182
+
183
+ private
184
+ def _truncate(document)
185
+ document.each do |key, value|
186
+ limit = FIELD_MAX_LENGTH[key]
187
+ if limit && value.to_s.length > limit
188
+ document[key] = value.to_s.slice(0...limit)
189
+ end
190
+ end
191
+ document
192
+ end
139
193
  end
140
194
 
141
195
  end
@@ -291,7 +291,7 @@ module Aws
291
291
  def data_to_http_resp(operation_name, data)
292
292
  api = config.api
293
293
  operation = api.operation(operation_name)
294
- ParamValidator.validate!(operation.output, data)
294
+ ParamValidator.new(operation.output, input: false).validate!(data)
295
295
  protocol_helper.stub_data(api, operation, data)
296
296
  end
297
297
 
@@ -78,14 +78,18 @@ module Aws
78
78
  # Retry loading credentials up to 3 times is the instance metadata
79
79
  # service is responding but is returning invalid JSON documents
80
80
  # in response to the GET profile credentials call.
81
- retry_errors([JSON::ParserError, StandardError], max_retries: 3) do
82
- c = JSON.parse(get_credentials.to_s)
83
- @credentials = Credentials.new(
84
- c['AccessKeyId'],
85
- c['SecretAccessKey'],
86
- c['Token']
87
- )
88
- @expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
81
+ begin
82
+ retry_errors([JSON::ParserError, StandardError], max_retries: 3) do
83
+ c = JSON.parse(get_credentials.to_s)
84
+ @credentials = Credentials.new(
85
+ c['AccessKeyId'],
86
+ c['SecretAccessKey'],
87
+ c['Token']
88
+ )
89
+ @expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
90
+ end
91
+ rescue JSON::ParserError
92
+ raise Aws::Errors::MetadataParserError.new
89
93
  end
90
94
  end
91
95