如何在netty中处理大于1024字节的http请求?

时间:2014-12-19 13:45:25

标签: java http netty reverse-proxy

我正在使用Netty编写一个简单的反向代理。由于我不想自己处理原始字节,我已经将一个请求解码器和对象聚合器添加到处理程序管道,以及一个响应编码器,最后是我自己的处理程序,这样的事情

ChannelPipeline p = ch.pipeline();
p.addLast(new HttpRequestDecoder());
p.addLast(new HttpObjectAggregator(MAX_CONTENT_LENGTH));
p.addLast(new HttpResponseEncoder());
p.addLast(new FrontendHandler(...));

我的FrontendHandler扩展了SimpleChannelInboundHandler<HttpRequest>,因此它有

// Start reading as soon as a request comes in...
public void channelActive(ChannelHandlerContext ctx) {
    ctx.read();
}

protected void channelRead0(ChannelHandlerContext ctx, HttpRequest request) {
    // copy request, fix headers, forward to backend server
}

如果请求进入大于1024字节(例如,它有一些cookie),服务器会挂起。通过一些试验和错误,我发现如果我在处理程序上设置ChannelOption.AUTO_READ一切正常,那么看起来我的旧代码在某处错过了ctx.read()调用,但我不知道在哪里。如果我做了像

这样的事情
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
    ctx.read();
}

然后我在channelRead0内部通过处理仍然不完整的http请求而得到异常,这种异常会破坏使用请求解码器/对象聚合器的目的。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我不知道HttpObjectAggregator是否可以处理分块消息。您可以尝试使用HttpChunkAggregator,例如:

    pipeline.addLast("decoder", new HttpRequestDecoder(4096, 4096, 100*1024*1024));
    pipeline.addLast("aggregator", new HttpChunkAggregator(100*1024*1024));
    pipeline.addLast("encoder", new HttpResponseEncoder());
    pipeline.addLast("hndlr", new FrontendHandler(...));