@Override
    public void filter(HttpRequestMessage zuulReq, HttpContent chunk) {
        if (zuulReq.getContext().isCancelled()) {
            chunk.release();
            return;
        }

        String endpointName = "-";
        try (TaskCloseable ignored = PerfMark.traceTask(this, s -> s.getClass().getSimpleName() + ".filterChunk")) {
            addPerfMarkTags(zuulReq);
            ZuulFilter<HttpRequestMessage, HttpResponseMessage> endpoint =
                    Preconditions.checkNotNull(getEndpoint(zuulReq), "endpoint");
            endpointName = endpoint.filterName();

            ByteBufUtil.touch(chunk, "Endpoint processing chunk, ZuulMessage: ", zuulReq);
            HttpContent newChunk = endpoint.processContentChunk(zuulReq, chunk);
            if (newChunk != null) {
                ByteBufUtil.touch(newChunk, "Endpoint buffering newChunk, ZuulMessage: ", zuulReq);
                // Endpoints do not directly forward content chunks to next stage in the filter chain.
                zuulReq.bufferBodyContents(newChunk);

                // deallocate original chunk if necessary
                if (newChunk != chunk) {
                    chunk.release();
                }

                if (isFilterAwaitingBody(zuulReq.getContext())
                        && zuulReq.hasCompleteBody()
                        && !(endpoint instanceof ProxyEndpoint)) {
                    // whole body has arrived, resume filter chain
                    ByteBufUtil.touch(newChunk, "Endpoint body complete, resume chain, ZuulMessage: ", zuulReq);
                    invokeNextStage(filter(endpoint, zuulReq));
                }
            }
        } catch (Exception ex) {
            ReferenceCountUtil.safeRelease(chunk);
            handleException(zuulReq, endpointName, ex);
        }
    }
This class is supposed to be thread safe and hence should not have any non final member variables
Created by saroskar on 5/18/17.
zuul-core/src/main/java/com/netflix/zuul/netty/filter/ZuulEndPointRunner.java