public void onRequestMessage(DeframedMessage message, boolean endOfStream) {
        try {
            final I request;
            final ByteBuf buf = message.buf();

            boolean success = false;
            try {
                // Special case for unary calls.
                if (messageReceived && method.getType() == MethodType.UNARY) {
                    final Status status = Status.INTERNAL.withDescription(
                            "More than one request messages for unary call or server streaming " +
                            "call");
                    closeListener(new ServerStatusAndMetadata(status, new Metadata(), true));
                    return;
                }
                messageReceived = true;

                if (closeCalled) {
                    return;
                }
                success = true;
            } finally {
                if (!success) {
                    message.close();
                }
            }

            final boolean grpcWebText = GrpcSerializationFormats.isGrpcWebText(serializationFormat);
            request = marshaller.deserializeRequest(message, grpcWebText);
            maybeLogRequestContent(request);

            if (unsafeWrapRequestBuffers && buf != null && !grpcWebText) {
                GrpcUnsafeBufferUtil.storeBuffer(buf, request, ctx);
            }

            if (blockingExecutor != null) {
                blockingExecutor.execute(() -> invokeOnMessage(request, endOfStream));
            } else {
                invokeOnMessage(request, endOfStream);
            }
        } catch (Throwable cause) {
            close(cause, true);
        }
    }
Cancels a call when the call was closed by a client, not by server.
grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/AbstractServerCall.java