Reputation: 28332
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
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
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