MixinSelectHandler.java
1.2 KB
package cc.leevi.common.socks5proxy;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.socksx.SocksPortUnificationServerHandler;
import io.netty.handler.codec.socksx.SocksVersion;
public class MixinSelectHandler extends SimpleChannelInboundHandler<ByteBuf> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {
final int readerIndex = msg.readerIndex();
if (msg.writerIndex() == readerIndex) {
return;
}
ChannelPipeline p = ctx.pipeline();
final byte versionVal = msg.getByte(readerIndex);
SocksVersion version = SocksVersion.valueOf(versionVal);
if(version.equals(SocksVersion.SOCKS4a) || version.equals(SocksVersion.SOCKS5)){
//socks proxy
p.addLast(new SocksPortUnificationServerHandler(),
SocksServerHandler.INSTANCE).remove(this);
}else{
//http/tunnel proxy
p.addLast(new HttpServerHeadDecoder()).remove(this);
}
msg.retain();
ctx.fireChannelRead(msg);
}
}