Ich versuche, einen High-Performance-Reverse-Proxy-Server mit Netty 4.1 zu programmieren. Ich basierte meinen Code auf einer Java-Anpassung von Feng-Zihao/protox und .Netty Filterung Reverse Proxy
Ich hatte zuerst einige Probleme bei der Verarbeitung von 100-CONTINUE, aber das Hinzufügen der HttpObjectAggregator
in meine Pipeline löste das irgendwie.
serverBootstrap
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.DEBUG))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG));
ch.pipeline().addLast(new HttpRequestDecoder());
ch.pipeline().addLast(new HttpResponseEncoder());
ch.pipeline().addLast(new HttpObjectAggregator(1048576));
ch.pipeline().addLast(new FrontendHandler());
}
})
// .option(ChannelOption.SO_REUSEADDR, true)
// .option(ChannelOption.SO_BACKLOG, 128)
// .childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.AUTO_READ, false)
.bind(port).sync();
Auf der Clientseite, hängt die Anforderung auf unbestimmte Zeit. Die Sache ist, AUTO_READ bei false
scheint zu verhindern, dass die HttpObjectAggregator
seine Arbeit zu tun und meine FrontendHandler
erhält nur die channelActive
Ereignis, aber nie die channelRead
.
Es seems though, dass ich brauche, um sicherzustellen, dass ich nicht in ein Race-Zustand zwischen den Lese-und der Remote-Peer-Verbindung bekommen.
FYI, mein Ziel am Ende ist zu wählen, um die Anfrage basierend auf einem Filter (wahrscheinlich ein neuer Handler direkt vor meinem FrontendHandler), die den vollständigen http-Inhalt lesen müssen.
Fehle ich hier etwas?