Я новичок в Netty и пытаюсь использовать обратный прокси-сервер HTTP, используя его. Я следую примеру io.netty.example.proxy.
Реализация прокси состоит из 3-х частей proxyinitializer frontendhandler backendhandler
Работает обратный прокси-сервер.
Но в моем обработчике веб-интерфейса я хочу декодировать HTTP-запросы и выполнять некоторые действия на основе URL-адреса хоста. Кроме того, в своем дескрипторе бэкэнда я хочу закодировать дополнительный заголовок в ответ http.
channelRead обработчика фронтэнда и бэкэнда принимает Object msg в качестве параметра:
Я пробовал следующие опции, но у меня ничего не получалось: 1. Попробовал напрямую привести приведение msg к FullHttpRequest и FullHttpResponse
Инициализация нового FullHttpresponse и копирование в него сообщения.
Попытка добавить HttpResponseEncoder и HttpRequestDecoder в конвейер канала.api для покрытия
Инициализатор:
@Override
public void initChannel(SocketChannel ch) {
//ch.pipeline().addLast("decoder", new HttpRequestDecoder());
//ch.pipeline().addLast("encoder", new HttpResponseEncoder());
//ch.pipeline().addLast("aggregator", new HttpObjectAggregator(1048576));
ch.pipeline().addLast(
new LoggingHandler(LogLevel.ERROR),
//new ResponseDataDecoder(),
//new HttpResponseEncoder(),
//new ResponseDataDecoder(),
new HexDumpProxyFrontendHandler(remoteHost, remotePort));
}
Активный канал дескриптора внешнего интерфейса
@Override
public void channelActive(ChannelHandlerContext ctx) {
inboundChannel = ctx.channel();
final long millis_startTime = System.currentTimeMillis();
// Start the connection attempt.
Bootstrap b = new Bootstrap();
b.group(inboundChannel.eventLoop())
.channel(ctx.channel().getClass())
.handler(new HexDumpProxyBackendHandler(inboundChannel, millis_startTime))
.option(ChannelOption.AUTO_READ, false);
ChannelFuture f = b.connect(remoteHost, remotePort);
outboundChannel = f.channel();
f.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
// connection complete start to read first data
inboundChannel.read();
} else {
// Close the connection if the connection attempt has failed.
inboundChannel.close();
}
}
});
}
Чтение канала обработчика внешнего интерфейса:
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) {
//FullHttpRequest req = (FullHttpRequest) msg;
System.out.println("msg is NOT instanceof httpRequest");
if (msg instanceof HttpRequest) {
System.out.println("msg is instanceof httpRequest");
.......
Channel Read of Backend Handler
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) {
/*FullHttpResponse data = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1,
HttpResponseStatus.OK,
Unpooled.copiedBuffer(msg.toString().getBytes())
);
*/
if (msg instanceof HttpResponse) {
System.err.println("it is http response");
}
.....