2016-01-31 14 views
6

Devo configurare il proxy socks nel client Netty (per richiedere siti diversi tramite socks4 o 5 proxy). provato un sacco di deleghe da calze liste libere (come www.socks-proxy.net, http://sockslist.net/ ecc), ma senza fortuna:come utilizzare Socks4/5 Proxy Handler in Netty Client (4.1)

@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); 
} 

la connessione si blocca, reset o di ottenere alcune strane eccezioni. Cosa c'è che non va? Supporto proxy aggiunto a Netty dal 4.1 (ora c'è un 4.1CR, provato e 4.1b7-8 prima)

risposta

5

L'istanza proxy deve essere la prima nella pipeline, poiché si desidera che gestisca la connessione al prima il proxy, prima di gestire qualsiasi contenuto HTTP.

per cambiare questo, modificare p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); a:

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

Come spiegato nella documentazione per ChannelPipeline, il flusso dei dati sta iniziando al primo gestore, e termina all'ultimo gestore.

+0

sembra OK se prima, grazie! – yetanothercoder

Problemi correlati