I see, thank you Oleg! On Fri, Sep 11, 2015 at 12:47 AM, Oleg Kalnichevski <ol...@apache.org> wrote:
> On Thu, 2015-09-10 at 12:27 -0700, Frank Dai wrote: > > Here is my complete workable Java code that supports HTTP and HTTPS > > requests using SOCKS proxy with synchronous HttpClient. > > > > import java.io.IOException; > > import java.net.InetSocketAddress; > > import java.net.Proxy; > > import java.net.Socket; > > import java.nio.charset.StandardCharsets; > > > > import org.apache.http.HttpHost; > > import org.apache.http.client.methods.CloseableHttpResponse; > > import org.apache.http.client.methods.HttpGet; > > import org.apache.http.client.protocol.HttpClientContext; > > import org.apache.http.config.Registry; > > import org.apache.http.config.RegistryBuilder; > > import org.apache.http.conn.socket.ConnectionSocketFactory; > > import org.apache.http.conn.socket.PlainConnectionSocketFactory; > > import org.apache.http.conn.ssl.SSLConnectionSocketFactory; > > import org.apache.http.impl.client.CloseableHttpClient; > > import org.apache.http.impl.client.HttpClients; > > import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; > > import org.apache.http.protocol.HttpContext; > > import org.apache.http.ssl.SSLContexts; > > import org.apache.http.util.EntityUtils; > > > > import javax.net.ssl.SSLContext; > > > > /** > > * How to send a HTTP or HTTPS request via SOCKS proxy. > > */ > > public class HttpClientWithSocksProxy { > > > > public static void main(String[] args) throws Exception { > > Registry<ConnectionSocketFactory> reg = > > RegistryBuilder.<ConnectionSocketFactory>create() > > .register("http", new MyHTTPConnectionSocketFactory()) > > .register("https", new > > MyHTTPSConnectionSocketFactory(SSLContexts.createSystemDefault > > ())) > > .build(); > > PoolingHttpClientConnectionManager cm = new > > PoolingHttpClientConnectionManager(reg); > > try (CloseableHttpClient httpclient = HttpClients.custom() > > .setConnectionManager(cm) > > .build()) { > > InetSocketAddress socksaddr = new > > InetSocketAddress("mysockshost", 1234); > > HttpClientContext context = HttpClientContext.create(); > > context.setAttribute("socks.address", socksaddr); > > > > HttpHost target = new HttpHost("www.example.com/", 80, > "http"); > > HttpGet request = new HttpGet("/"); > > > > System.out.println("Executing request " + request + " to " > > + target + " via SOCKS " + > > "proxy " + socksaddr); > > try (CloseableHttpResponse response = > > httpclient.execute(target, request, context)) { > > > System.out.println("----------------------------------------"); > > System.out.println(response.getStatusLine()); > > > > System.out.println(EntityUtils.toString(response.getEntity(), > > StandardCharsets > > .UTF_8)); > > } > > } > > } > > > > static class MyHTTPConnectionSocketFactory extends > > PlainConnectionSocketFactory { > > @Override > > public Socket createSocket(final HttpContext context) throws > > IOException { > > InetSocketAddress socksaddr = (InetSocketAddress) > > context.getAttribute("socks.address"); > > Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); > > return new Socket(proxy); > > } > > } > > > > static class MyHTTPSConnectionSocketFactory extends > > SSLConnectionSocketFactory { > > public MyHTTPSConnectionSocketFactory(final SSLContext > sslContext) { > > super(sslContext); > > } > > > > @Override > > public Socket createSocket(final HttpContext context) throws > > IOException { > > InetSocketAddress socksaddr = (InetSocketAddress) > > context.getAttribute("socks.address"); > > Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); > > return new Socket(proxy); > > } > > } > > } > > > > When it comes to HttpAsyncClient, how can I use socks proxy with > > HttpAsyncClient? > > You basically cannot. HttpAsyncClient non-blocking i/o model does not > support TCP level proxy protocols such as SOCKS. > > Oleg > > > > Here is my incomplete Java code which is not workable yet: > > > > import java.io.IOException; > > import java.net.InetSocketAddress; > > import java.net.Proxy; > > import java.net.Socket; > > import java.nio.charset.StandardCharsets; > > import java.util.concurrent.CountDownLatch; > > > > import org.apache.http.HttpResponse; > > import org.apache.http.client.methods.HttpGet; > > import org.apache.http.client.protocol.HttpClientContext; > > import org.apache.http.concurrent.FutureCallback; > > import org.apache.http.config.Registry; > > import org.apache.http.config.RegistryBuilder; > > import org.apache.http.conn.socket.ConnectionSocketFactory; > > import org.apache.http.conn.socket.PlainConnectionSocketFactory; > > import org.apache.http.conn.ssl.SSLConnectionSocketFactory; > > import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; > > import org.apache.http.impl.nio.client.HttpAsyncClients; > > import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; > > import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; > > import org.apache.http.protocol.HttpContext; > > import org.apache.http.ssl.SSLContexts; > > import org.apache.http.util.EntityUtils; > > > > import javax.net.ssl.SSLContext; > > > > > > public class HttpAsyncClientWithSocksProxy { > > public static void main(String[] args) throws Exception { > > Registry<ConnectionSocketFactory> reg = > > RegistryBuilder.<ConnectionSocketFactory>create() > > .register("http", new MyHTTPConnectionSocketFactory()) > > .register("https", new MyHTTPSConnectionSocketFactory( > > SSLContexts.createSystemDefault())) > > .build(); > > PoolingNHttpClientConnectionManager cm = new > > PoolingNHttpClientConnectionManager( > > new DefaultConnectingIOReactor()); > > try (CloseableHttpAsyncClient httpclient = > HttpAsyncClients.custom() > > .setConnectionManager(cm) > > .build()) { > > InetSocketAddress socksaddr = new > > InetSocketAddress("mysockshost", 1234); > > HttpClientContext context = HttpClientContext.create(); > > context.setAttribute("socks.address", socksaddr); > > > > HttpGet request = new HttpGet("http://www.example.com/"); > > > > System.out.println("Executing request " + request + " via > > SOCKS " + "proxy " + socksaddr); > > final CountDownLatch latch = new CountDownLatch(1); > > httpclient.execute(request, new > FutureCallback<HttpResponse>() { > > > > public void completed(final HttpResponse response) { > > latch.countDown(); > > System.out.println(request.getRequestLine() + "->" > > + response.getStatusLine()); > > try { > > > > System.out.println(EntityUtils.toString(response.getEntity(), > > StandardCharsets.UTF_8)); > > } catch (IOException e) { > > e.printStackTrace(); > > } > > } > > > > public void failed(final Exception ex) { > > latch.countDown(); > > System.out.println(request.getRequestLine() + "->" + > ex); > > } > > > > public void cancelled() { > > latch.countDown(); > > System.out.println(request.getRequestLine() + " > cancelled"); > > } > > > > }); > > latch.wait(); > > } > > } > > > > static class MyHTTPConnectionSocketFactory extends > > PlainConnectionSocketFactory { > > @Override > > public Socket createSocket(final HttpContext context) throws > > IOException { > > InetSocketAddress socksaddr = (InetSocketAddress) > > context.getAttribute("socks.address"); > > Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); > > return new Socket(proxy); > > } > > } > > > > static class MyHTTPSConnectionSocketFactory extends > > SSLConnectionSocketFactory { > > public MyHTTPSConnectionSocketFactory(final SSLContext > sslContext) { > > super(sslContext); > > } > > > > @Override > > public Socket createSocket(final HttpContext context) throws > > IOException { > > InetSocketAddress socksaddr = (InetSocketAddress) > > context.getAttribute("socks.address"); > > Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); > > return new Socket(proxy); > > } > > } > > } > > > > Any ideas? Thanks in advance! > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org > For additional commands, e-mail: httpclient-users-h...@hc.apache.org > > -- My tech blog: http://www.soulmachine.me My GitHub: https://github.com/soulmachine My LinkedIn: http://www.linkedin.com/in/soulmachine/ My Sina Weibo: http://weibo.com/soulmachine