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