private void channelReadInternal()

in zuul-core/src/main/java/com/netflix/zuul/netty/server/ClientRequestReceiver.java [128:214]


    private void channelReadInternal(ChannelHandlerContext ctx, Object msg) {
        // Flag that we have now received the LastContent for this request from the client.
        // This is needed for ClientResponseReceiver to know whether it's yet safe to start writing
        // a response to the client channel.
        if (msg instanceof LastHttpContent) {
            ctx.channel().attr(ATTR_LAST_CONTENT_RECEIVED).set(Boolean.TRUE);
        }

        if (msg instanceof HttpRequest) {
            clientRequest = (HttpRequest) msg;

            zuulRequest = buildZuulHttpRequest(clientRequest, ctx);

            // Handle invalid HTTP requests.
            if (clientRequest.decoderResult().isFailure()) {
                LOG.warn(
                        "Invalid http request. clientRequest = {} , uri = {}, info = {}",
                        clientRequest,
                        clientRequest.uri(),
                        ChannelUtils.channelInfoForLogging(ctx.channel()),
                        clientRequest.decoderResult().cause());
                StatusCategoryUtils.setStatusCategory(
                        zuulRequest.getContext(),
                        ZuulStatusCategory.FAILURE_CLIENT_BAD_REQUEST,
                        "Invalid request provided: Decode failure");
                RejectionUtils.rejectByClosingConnection(
                        ctx,
                        ZuulStatusCategory.FAILURE_CLIENT_BAD_REQUEST,
                        "decodefailure",
                        clientRequest,
                        /* injectedLatencyMillis= */ null);
                return;
            } else if (zuulRequest.hasBody() && zuulRequest.getBodyLength() > zuulRequest.getMaxBodySize()) {
                String errorMsg = "Request too large. "
                        + "clientRequest = " + clientRequest.toString()
                        + ", uri = " + String.valueOf(clientRequest.uri())
                        + ", info = " + ChannelUtils.channelInfoForLogging(ctx.channel());
                ZuulException ze = new ZuulException(errorMsg);
                ze.setStatusCode(HttpResponseStatus.REQUEST_ENTITY_TOO_LARGE.code());
                StatusCategoryUtils.setStatusCategory(
                        zuulRequest.getContext(),
                        ZuulStatusCategory.FAILURE_CLIENT_BAD_REQUEST,
                        "Invalid request provided: Request body size " + zuulRequest.getBodyLength()
                                + " is above limit of " + zuulRequest.getMaxBodySize());
                zuulRequest.getContext().setError(ze);
                zuulRequest.getContext().setShouldSendErrorResponse(true);
            } else if (zuulRequest
                            .getHeaders()
                            .getAll(HttpHeaderNames.HOST.toString())
                            .size()
                    > 1) {
                LOG.debug(
                        "Multiple Host headers. clientRequest = {} , uri = {}, info = {}",
                        clientRequest,
                        clientRequest.uri(),
                        ChannelUtils.channelInfoForLogging(ctx.channel()));
                ZuulException ze = new ZuulException("Multiple Host headers");
                ze.setStatusCode(HttpResponseStatus.BAD_REQUEST.code());
                StatusCategoryUtils.setStatusCategory(
                        zuulRequest.getContext(),
                        ZuulStatusCategory.FAILURE_CLIENT_BAD_REQUEST,
                        "Invalid request provided: Multiple Host headers");
                zuulRequest.getContext().setError(ze);
                zuulRequest.getContext().setShouldSendErrorResponse(true);
            }

            handleExpect100Continue(ctx, clientRequest);

            // Send the request down the filter pipeline
            ctx.fireChannelRead(zuulRequest);
        } else if (msg instanceof HttpContent) {
            if ((zuulRequest != null) && !zuulRequest.getContext().isCancelled()) {
                ctx.fireChannelRead(msg);
            } else {
                // We already sent response for this request, these are laggard request body chunks that are still
                // arriving
                ReferenceCountUtil.release(msg);
            }
        } else if (msg instanceof HAProxyMessage) {
            // do nothing, should already be handled by ElbProxyProtocolHandler
            LOG.debug("Received HAProxyMessage for Proxy Protocol IP: {}", ((HAProxyMessage) msg).sourceAddress());
            ReferenceCountUtil.release(msg);
        } else {
            LOG.debug("Received unrecognized message type. {}", msg.getClass().getName());
            ReferenceCountUtil.release(msg);
        }
    }