in tchannel-core/src/main/java/com/uber/tchannel/handlers/MessageDefragmenter.java [96:140]
private TChannelMessage decodeCallFrame(ChannelHandlerContext ctx, CallFrame frame) {
ArgScheme scheme;
if (frame.getType() == FrameType.CallRequest) {
scheme = ArgScheme.toScheme(((CallRequestFrame) frame).getHeaders().get(TransportHeaders.ARG_SCHEME_KEY));
} else {
scheme = ArgScheme.toScheme(((CallResponseFrame) frame).getHeaders().get(TransportHeaders.ARG_SCHEME_KEY));
}
if (!ArgScheme.isSupported(scheme)) {
if (frame.getType() == FrameType.CallRequest) {
sendError(ErrorType.BadRequest,
"Arg Scheme not specified or unsupported", frame.getId(), ctx);
} else {
logger.error("Arg Scheme not specified or unsupported: {}", scheme);
}
return null;
}
List<CallFrame> frames = new ArrayList<>();
frames.add(frame);
frame.retain();
final TChannelMessage result;
boolean release = true;
try {
if (!hasMore(frame)) {
result = MessageCodec.decodeCallFrames(frames);
} else {
callFrames.put(frame.getId(), frames);
result = null;
}
release = false;
} finally {
if (release) {
frame.release();
}
}
if (result != null) {
result.touch("finished MessageDefragmenter.decodeCallFrame");
}
return result;
}