class Aws::Binary::EventParser
@api private
Public Class Methods
new(parser_class, rules, error_refs, output_ref)
click to toggle source
@param [Class] parser_class @param [Seahorse::Model::ShapeRef] rules (of eventstream member) @param [Array] error_refs array of errors ShapeRef @param [Seahorse::Model::ShapeRef] output_ref
# File lib/aws-sdk-core/binary/event_parser.rb, line 14 def initialize(parser_class, rules, error_refs, output_ref) @parser_class = parser_class @rules = rules @error_refs = error_refs @output_ref = output_ref end
Public Instance Methods
apply(raw_event)
click to toggle source
Parse raw event message into event struct based on its ShapeRef
@return [Struct] Event Struct
# File lib/aws-sdk-core/binary/event_parser.rb, line 25 def apply(raw_event) parse(raw_event) end
Private Instance Methods
eventpayload_streaming?(ref)
click to toggle source
# File lib/aws-sdk-core/binary/event_parser.rb, line 125 def eventpayload_streaming?(ref) BlobShape === ref.shape || StringShape === ref.shape end
parse(raw_event)
click to toggle source
# File lib/aws-sdk-core/binary/event_parser.rb, line 31 def parse(raw_event) message_type = raw_event.headers.delete(":message-type") if message_type case message_type.value when 'error' parse_error_event(raw_event) when 'event' parse_event(raw_event) when 'exception' parse_exception(raw_event) else raise Aws::Errors::EventStreamParserError.new( 'Unrecognized :message-type value for the event') end else # no :message-type header, regular event by default parse_event(raw_event) end end
parse_error_event(raw_event)
click to toggle source
# File lib/aws-sdk-core/binary/event_parser.rb, line 60 def parse_error_event(raw_event) error_code = raw_event.headers.delete(":error-code") error_message = raw_event.headers.delete(":error-message") Aws::Errors::EventError.new( :error, error_code ? error_code.value : error_code, error_message ? error_message.value : error_message ) end
parse_event(raw_event)
click to toggle source
# File lib/aws-sdk-core/binary/event_parser.rb, line 70 def parse_event(raw_event) event_type = raw_event.headers.delete(":event-type").value # content_type = raw_event.headers.delete(":content-type").value if event_type == 'initial-response' event = Struct.new(:event_type, :response).new event.event_type = :initial_response event.response = parse_payload(raw_event.payload.read, @output_ref) return event end # locate event from eventstream name, ref = @rules.shape.member_by_location_name(event_type) unless ref && ref.event return Struct.new(:event_type, :raw_event_type, :raw_event) .new(:unknown_event, event_type, raw_event) end event = ref.shape.struct_class.new explicit_payload = false implicit_payload_members = {} ref.shape.members.each do |member_name, member_ref| unless member_ref.eventheader if member_ref.eventpayload explicit_payload = true else implicit_payload_members[member_name] = member_ref end end end # implicit payload if !explicit_payload && !implicit_payload_members.empty? event = parse_payload(raw_event.payload.read, ref) end event.event_type = name # locate payload and headers in the event ref.shape.members.each do |member_name, member_ref| if member_ref.eventheader # allow incomplete event members in response if raw_event.headers.key?(member_ref.location_name) event.send("#{member_name}=", raw_event.headers[member_ref.location_name].value) end elsif member_ref.eventpayload # explicit payload eventpayload_streaming?(member_ref) ? event.send("#{member_name}=", raw_event.payload) : event.send("#{member_name}=", parse_payload(raw_event.payload.read, member_ref)) end end event end
parse_exception(raw_event)
click to toggle source
# File lib/aws-sdk-core/binary/event_parser.rb, line 51 def parse_exception(raw_event) exception_type = raw_event.headers.delete(":exception-type").value name, ref = @rules.shape.member_by_location_name(exception_type) # exception lives in payload implictly exception = parse_payload(raw_event.payload.read, ref) exception.event_type = name exception end
parse_payload(body, rules)
click to toggle source
# File lib/aws-sdk-core/binary/event_parser.rb, line 129 def parse_payload(body, rules) @parser_class.new(rules).parse(body) if body.size > 0 end