How to use Socks4 / 5 Proxy Handlers in Netty Client (4.1)

I need to configure the socks proxy in the Netty client (request different sites through socks4 or 5 proxies). I tried a lot of proxies from free sock lists (for example, www.socks-proxy.net, http://sockslist.net/ , etc.), but no luck:

@Test public void testProxy() throws Exception { final String ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; final String host = "www.main.de"; final int port = 80; Bootstrap b = new Bootstrap(); b.group(new NioEventLoopGroup()) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); p.addLast(new HttpClientCodec()); p.addLast(new HttpContentDecompressor()); p.addLast(new HttpObjectAggregator(10_485_760)); p.addLast(new ChannelInboundHandlerAdapter() { @Override public void channelActive(final ChannelHandlerContext ctx) throws Exception { HttpRequest request = new DefaultFullHttpRequest(HTTP_1_1, GET, "/"); request.headers().set(HOST, host + ":" + port); request.headers().set(USER_AGENT, ua); request.headers().set(CONNECTION, CLOSE); ctx.writeAndFlush(request); System.out.println("!sent"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("!answer"); if (msg instanceof FullHttpResponse) { FullHttpResponse httpResp = (FullHttpResponse) msg; ByteBuf content = httpResp.content(); String strContent = content.toString(UTF_8); System.out.println("body: " + strContent); finish.countDown(); return; } super.channelRead(ctx, msg); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(System.err); ctx.close(); finish.countDown(); } }); p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); } }); b.connect(host, port).awaitUninterruptibly(); System.out.println("!connected"); finish.await(1, MINUTES); } 

The connection hangs, resets, or receives some strange exceptions. What's wrong? Proxy support was added to Netty with 4.1 (now there is 4.1CR, I tried 4.1b7-8 before)

+6
source share
1 answer

The proxy instance must be the first in the pipeline, since you want to process the connection to the proxy first before processing the contents of http.

To change this, change p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); on the:

 p.addFirst(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); 

As explained in the documentation for ChannelPipeline , the data stream begins with the first handler and ends with the last handler.

+5
source

All Articles