@Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof HAProxyMessage hapm) {
            Channel channel = ctx.channel();
            channel.attr(ATTR_HAPROXY_MESSAGE).set(hapm);
            ctx.channel().closeFuture().addListener((ChannelFutureListener) future -> hapm.release());
            channel.attr(ATTR_HAPROXY_VERSION).set(hapm.protocolVersion());
            // Parse and persist any custom TLVs that might be part of the connection
            List<HAProxyTLV> tlvList = hapm.tlvs().stream()
                    .filter(tlv -> tlv.type() == HAProxyTLV.Type.OTHER)
                    .collect(Collectors.toList());
            channel.attr(ATTR_HAPROXY_CUSTOM_TLVS).set(tlvList);
            // Get the real host and port that the client connected with.
            parseDstAddr(hapm, channel);
            parseSrcAddr(hapm, channel);
            // Remove ourselves (this handler) from the channel now, as this is conn. level info
            ctx.pipeline().remove(this);
        }
    }
Copies any decoded HAProxyMessage into the channel attributes, and doesn't pass it any further along the pipeline.
Use in conjunction with HAProxyMessageDecoder if proxy protocol is enabled on the ELB.
zuul-core/src/main/java/com/netflix/netty/common/proxyprotocol/HAProxyMessageChannelHandler.java