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

Java 如何在netty中处理大于1024字节的http请求?,java,http,netty,reverse-proxy,Java,Http,Netty,Reverse Proxy,我正在使用Netty编写一个简单的反向代理。因为我不想自己处理原始字节,所以我在处理程序管道中添加了一个请求解码器和对象聚合器,以及一个响应编码器,最后是我自己的处理程序,类似这样的 ChannelPipeline p = ch.pipeline(); p.addLast(new HttpRequestDecoder()); p.addLast(new HttpObjectAggregator(MAX_CONTENT_LENGTH)); p.addLast(new HttpResponseEnc

我正在使用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
,因此它有一个

// 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\u READ
,一切正常,因此我的旧代码似乎在某个地方缺少一个
ctx.READ()
调用,但我不知道在哪里。如果我做了类似的事情

@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
    ctx.read();
}

然后我在
channelRead0
中得到异常,这些异常似乎是由于处理了一个仍然不完整的http请求而导致的,这有点违背了使用请求解码器/对象聚合器的目的。我遗漏了什么?

我不知道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(...));

请检查一下这可能会有帮助。。。