public static void rejectByClosingConnection(
            ChannelHandlerContext ctx,
            StatusCategory nfStatus,
            String reason,
            HttpRequest request,
            @Nullable Integer injectedLatencyMillis) {

        // Notify other handlers before closing the conn.
        notifyHandlers(ctx, nfStatus, REJECT_CLOSING_STATUS, reason, request);

        if (injectedLatencyMillis != null && injectedLatencyMillis > 0) {
            // Delay closing the connection for configured time.
            ctx.executor()
                    .schedule(
                            () -> {
                                CurrentPassport.fromChannel(ctx.channel()).add(PassportState.SERVER_CH_REJECTING);
                                ctx.close();
                            },
                            injectedLatencyMillis,
                            TimeUnit.MILLISECONDS);
        } else {
            // Close the connection immediately.
            CurrentPassport.fromChannel(ctx.channel()).add(PassportState.SERVER_CH_REJECTING);
            ctx.close();
        }
    }
Closes the connection without sending a response, and fires a {@link RequestRejectedEvent} back up the pipeline.

@param nfStatus              the status to use for metric reporting
@param reason                the reason for rejecting the request.  This is not sent back to the client.
@param request               the request that is being rejected.
@param injectedLatencyMillis optional parameter to delay sending a response. The reject notification is still
                             sent up the pipeline.
zuul-core/src/main/java/com/netflix/netty/common/throttle/RejectionUtils.java