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: [email protected]
For additional commands, e-mail: [email protected]