private TChannelMessage decodeCallFrame()

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;
    }