1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
# frozen_string_literal: true
module Aws
module Binary
# @api private
class DecodeHandler < Seahorse::Client::Handler
def call(context)
if eventstream_member = eventstream?(context)
attach_eventstream_listeners(context, eventstream_member)
end
@handler.call(context)
end
private
def eventstream?(ctx)
ctx.operation.output.shape.members.each do |_, ref|
return ref if ref.eventstream
end
end
def attach_eventstream_listeners(context, rules)
context.http_response.on_headers(200) do
protocol = context.config.api.metadata['protocol']
output_handler = context[:output_event_stream_handler] || context[:event_stream_handler]
context.http_response.body = EventStreamDecoder.new(
protocol,
rules,
context.operation.output,
context.operation.errors,
context.http_response.body,
output_handler)
if input_emitter = context[:input_event_emitter]
# #emit will be blocked until 200 success
# see Aws::EventEmitter#emit
input_emitter.signal_queue << "ready"
end
end
context.http_response.on_success(200) do
context.http_response.body = context.http_response.body.events
end
context.http_response.on_error do
# Potential enhancement to made
# since we don't want to track raw bytes in memory
context.http_response.body = StringIO.new
end
end
end
end
end
|