java - netty如何处理大于1024字节的http请求?

标签 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 请求引起的,这违背了使用请求解码器/对象聚合器的目的。我错过了什么?

最佳答案

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

关于java - netty如何处理大于1024字节的http请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567398/

相关文章:

java - 为什么我的 JTable CellRenderer 一直在运行?

java - Android Java 应用程序 : Extending two classes (walk around)

http - 在 tshark 或 tcpdump 中过滤仅初始 GET 请求。包括 HTTP 和 HTTPS

http - 使用 GuzzleHttp 发布请求

java - 如果打包在 *.war 文件中,Switchyard 服务将无法工作

java - 使用 Java 节点构建我自己的队列

http - 谷歌字体的跨源请求警告

java - Nagle的算法是用Play框架/Netty开启还是关闭?

asynchronous - 进行 REST 调用的 Flink 转换(异步、Future、Netty)

java - 使用 Netty,如何存储每个套接字连接的状态?