Невозможно просмотреть HTTP-запрос или ответ в моей реализации обратного прокси-сервера - PullRequest
0 голосов
/ 07 октября 2019

Я новичок в 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");
        }
.....
...