下面列出了怎么用 io.netty.handler.codec.socksx.v5.Socks5CommandStatus 的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
protected boolean handleProxyProtocol(ChannelHandlerContext ctx, Object msg) throws Exception {
if (!authenticated) {
authenticated = authenticate(ctx, msg);
return false;
}
Socks5CommandRequest req = (Socks5CommandRequest) msg;
assertThat(req.type(), is(Socks5CommandType.CONNECT));
Socks5CommandResponse res =
new DefaultSocks5CommandResponse(Socks5CommandStatus.SUCCESS, Socks5AddressType.IPv4);
intermediaryDestination = SocketUtils.socketAddress(req.dstAddr(), req.dstPort());
ctx.write(res);
ctx.pipeline().remove(ENCODER);
ctx.pipeline().remove(DECODER);
return true;
}
private void onSocksSuccess(ChannelHandlerContext ctx, Socks5CommandRequest request) {
Address serverAddr = new Address(request.dstAddr(), request.dstPort());
createServerChannel(ctx, serverAddr).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (future.isSuccess()) {
ConnectionInfo newConnectionInfo = new ConnectionInfo(
connectionInfo.getClientAddr(), serverAddr);
ctx.writeAndFlush(new DefaultSocks5CommandResponse(
Socks5CommandStatus.SUCCESS,
request.dstAddrType(),
request.dstAddr(),
request.dstPort()));
onServerConnected(ctx, newConnectionInfo, future.channel());
} else {
ctx.channel().writeAndFlush(new DefaultSocks5CommandResponse(
Socks5CommandStatus.FAILURE,
request.dstAddrType(),
request.dstAddr(),
request.dstPort()));
ctx.close();
}
}
});
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, Socks5Message msg) throws Exception {
if (msg instanceof DefaultSocks5InitialRequest) {
ctx.pipeline().addBefore(ctx.name(), Socks5CommandRequestDecoder.class.getName(),
new Socks5CommandRequestDecoder());
ctx.writeAndFlush(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (msg instanceof DefaultSocks5CommandRequest) {
final DefaultSocks5CommandRequest req = (DefaultSocks5CommandRequest) msg;
ctx.pipeline().remove(Socks5CommandRequestDecoder.class);
ctx.fireUserEventTriggered(new ProxySuccessEvent(
new InetSocketAddress(req.dstAddr(), req.dstPort()),
new DefaultSocks5CommandResponse(Socks5CommandStatus.SUCCESS,
Socks5AddressType.IPv4)));
} else {
throw new IllegalStateException("unexpected msg: " + msg);
}
}
@Override
void read(ConnectionFlow flow, Object msg) {
removeHandlerIfPresent(SOCKS_ENCODER_NAME);
removeHandlerIfPresent(SOCKS_DECODER_NAME);
if (msg instanceof Socks5CommandResponse) {
if (((Socks5CommandResponse) msg).status() == Socks5CommandStatus.SUCCESS) {
flow.advance();
return;
}
}
flow.fail();
}