获取 Netty 中接收到的 gzip 分块响应字节数
Get the number of received bytes in Netty for 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);
当服务器 returns 非分块响应时,它包含 Content-Length header。我成功地在我的自定义 HttpContentDecompressor 中检索到这个值,就在它删除这个 header 并执行 gzip 解压缩之前。
但是当服务器决定发送分块响应时,我很不走运,因为没有 Content-Length header。我试过 HttpObjectAggregator 但似乎 returns 解压缩的字节数。我还查看了 netty traffic
包,但它解决了不同的任务。
我觉得解决方法很简单,但我对netty不是很了解。也许有一种方法可以向管道添加一个处理程序(例如在解压缩器之前),它将读取缓冲区中的所有字节,保存数字并将它们进一步传递给管道?一些代码示例将非常有帮助。
解决方案:
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());
...
我正在尝试解决描述中的问题。目前我有这个管道:
p.addLast(sslCtx.newHandler(ch.alloc()));
p.addLast(new HttpClientCodec());
p.addLast(new MyCustomHttpContentDecompressor());
// p.addLast(new HttpObjectAggregator(1048576));
p.addLast(businessLogicHandler);
当服务器 returns 非分块响应时,它包含 Content-Length header。我成功地在我的自定义 HttpContentDecompressor 中检索到这个值,就在它删除这个 header 并执行 gzip 解压缩之前。
但是当服务器决定发送分块响应时,我很不走运,因为没有 Content-Length header。我试过 HttpObjectAggregator 但似乎 returns 解压缩的字节数。我还查看了 netty traffic
包,但它解决了不同的任务。
我觉得解决方法很简单,但我对netty不是很了解。也许有一种方法可以向管道添加一个处理程序(例如在解压缩器之前),它将读取缓冲区中的所有字节,保存数字并将它们进一步传递给管道?一些代码示例将非常有帮助。
解决方案:
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());
...