Получить количество полученных байтов в Netty для gzip chunked response

Я пытаюсь решить проблему в описании. В настоящее время у меня есть этот конвейер:

p.addLast(sslCtx.newHandler(ch.alloc()));
p.addLast(new HttpClientCodec());
p.addLast(new MyCustomHttpContentDecompressor());
// p.addLast(new HttpObjectAggregator(1048576));
p.addLast(businessLogicHandler);

Когда сервер возвращает непоследовательный ответ, он содержит заголовок Content-Length. Мне удалось получить это значение в моем пользовательском HttpContentDecompressor как раз перед тем, как он удаляет этот заголовок и выполняет распаковку gzip.

Но когда сервер решает отправить чанкированный ответ, мне не повезло, так как нет заголовка Content-Length. Я попытался HttpObjectAggregator, но кажется, что он возвращает количество распакованных байтов. Я также рассмотрел нетти traffic пакет, но это решает другую задачу.

Я чувствую, что решение простое, но я плохо знаю Netty. Может быть, есть способ добавить еще один обработчик в конвейер (например, перед декомпрессором), который будет читать все байты в буфере, сохранять число и передавать их дальше в конвейер? Некоторые примеры кода будут очень полезны.

1 ответ

Решение

Решение:

public class TrafficInterceptorHandler extends ChannelInboundHandlerAdapter {

    public static final String NAME = "trafficInterceptor";
    private static Logger LOG = LoggerFactory.getLogger(TrafficInterceptorHandler.class);

    private AtomicInteger readBytes = new AtomicInteger(0);

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof ByteBuf) {
            ByteBuf byteBuf = (ByteBuf) msg;
            readBytes.addAndGet(byteBuf.readableBytes());
        } else {
            LOG.warn("Received msg is not a ByteBuffer. Actual class: " + msg.getClass());
        }
        ctx.fireChannelRead(msg);
    }
    public int getReadBytes() {
        return readBytes.get();
    }
}

Должен быть добавлен в конвейер раньше других обработчиков

p.addLast(TrafficInterceptorHandler.NAME, new TrafficInterceptorHandler());
p.addLast(sslCtx.newHandler(ch.alloc()));
p.addLast(new HttpClientCodec());
...
Другие вопросы по тегам