content: package com.alibaba.arthas.tunnel.server;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import io.netty.buffer.Unpooled;
  import io.netty.channel.Channel;
  import io.netty.channel.ChannelFutureListener;
  import io.netty.channel.ChannelHandlerContext;
  import io.netty.channel.ChannelInboundHandlerAdapter;
  import io.netty.util.ReferenceCountUtil;
  
  public final class RelayHandler extends ChannelInboundHandlerAdapter {
  
      private final static Logger logger = LoggerFactory.getLogger(RelayHandler.class);
  
      private final Channel relayChannel;
  
      public RelayHandler(Channel relayChannel) {
          this.relayChannel = relayChannel;
      }
  
      @Override
      public void channelActive(ChannelHandlerContext ctx) {
          ctx.writeAndFlush(Unpooled.EMPTY_BUFFER);
      }
  
      @Override
      public void channelRead(ChannelHandlerContext ctx, Object msg) {
          if (relayChannel.isActive()) {
              relayChannel.writeAndFlush(msg);
          } else {
              ReferenceCountUtil.release(msg);
          }
      }
  
      @Override
      public void channelInactive(ChannelHandlerContext ctx) {
          if (relayChannel.isActive()) {
              relayChannel.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
          }
      }
  
      @Override
      public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
          logger.error("", cause);
          ctx.close();
      }
  }
  