Fluffy
Fluffy

Reputation: 28332

How to use URLConnection through a SOCKS proxy?

How can I set the SOCKS proxy for a URLConnection given by (new URL(url)).openConnection()?

Different proxies are needed on a per-connection basis, so please don't suggest setting system properties.

Upvotes: 1

Views: 3088

Answers (2)

bezbos.
bezbos.

Reputation: 2344

You can set up per-connection proxies with the Proxy and ProxySelector classes. Here is an example of per-connection proxying with the Java 11 HttpClient and the legacy HttpURLConnection:

public static void java11Http(String url) throws Exception {
    ProxySelector proxySelector = new ProxySelector() {
        @Override
        public List<Proxy> select(URI uri) {
            return List.of(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1234)));
        }
        @Override
        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
            ioe.printStackTrace();
        }
    };

    HttpClient client = HttpClient.newBuilder()
            .proxy(proxySelector)
            .build();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
}

private static void legacyJavaHttp(String url) {
    SocketAddress proxyAddr = new InetSocketAddress("127.0.0.1", 1234);
    Proxy pr = new Proxy(Proxy.Type.SOCKS, proxyAddr);

    try {
        HttpURLConnection con = (HttpURLConnection) URI.create(url).toURL().openConnection(pr);
        con.setConnectTimeout(5000);
        con.setReadTimeout(5000);
        con.connect();
        System.out.println(con.getResponseMessage());
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

You can read more on Java proxying here: https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html

Upvotes: 0

Stephen C
Stephen C

Reputation: 718658

If you want to use different proxy settings on a per-connection bases, you can use the Java 6.0 ProxySelector mechanism as described in Java Networking and Proxies. Specifically, read sections 3 and 4.

Upvotes: 4

Related Questions