I want my Java program to use the system\'s proxy configuration. Accordingly, I used the code found in many places, such as this answer, to set java.net.useSystemProxi
You can use Proxy Vole to solve this issue:
If you know exactly which PAC-file you want to use, you can do:
UrlPacScriptSource source = new UrlPacScriptSource("http://www.example.org/proxy.pac");
PacProxySelector selector = new PacProxySelector(source);
ProxySelector.setDefault(selector);
The advantage of this is that it is not user-related. For example if running this as a Windows service, you may end up running it on the SYSTEM-user which may not have the same OS_DEFAULT
proxy settings (if any) as the Administrator-user.
The approach using system/software values is:
ProxySearch proxySearch = new ProxySearch();
proxySearch.addStrategy(Strategy.OS_DEFAULT);
proxySearch.addStrategy(Strategy.BROWSER);
proxySearch.addStrategy(Strategy.JAVA);
ProxySelector proxySelector = proxySearch.getProxySelector();
ProxySelector.setDefault(proxySelector);
This starts with OS_DEFAULT
, then JAVA
and lastly BROWSER
as strategies for the proxy selector.
This code is based on the GitHub code, release version 1.0.3.
I could load Proxy Auto-Config (PAC) file on Java. Please see below codes and package. I hope this would what you were looking for:
import com.sun.deploy.net.proxy.*;
.
.
BrowserProxyInfo b = new BrowserProxyInfo();
b.setType(ProxyType.AUTO);
b.setAutoConfigURL("http://yourhost/proxy.file.pac");
DummyAutoProxyHandler handler = new DummyAutoProxyHandler();
handler.init(b);
URL url = new URL("http://host_to_query");
ProxyInfo[] ps = handler.getProxyInfo(url);
for(ProxyInfo p : ps){
System.out.println(p.toString());
}
You already have a [com.sun.deploy.net.proxy] package on your machine! Find [deploy.jar] ;D
As already suggested by Mads Hansen, Proxy-Vole does the trick!
You just need to add the jar from the download site to your classpath (dlls are included) and this code helped me to configure the proxy stettings:
ProxySearch proxySearch = new ProxySearch();
proxySearch.addStrategy(Strategy.OS_DEFAULT);
proxySearch.addStrategy(Strategy.JAVA);
proxySearch.addStrategy(Strategy.BROWSER);
ProxySelector proxySelector = proxySearch.getProxySelector();
ProxySelector.setDefault(proxySelector);
URI home = URI.create("http://www.google.com");
System.out.println("ProxySelector: " + proxySelector);
System.out.println("URI: " + home);
List<Proxy> proxyList = proxySelector.select(home);
if (proxyList != null && !proxyList.isEmpty()) {
for (Proxy proxy : proxyList) {
System.out.println(proxy);
SocketAddress address = proxy.address();
if (address instanceof InetSocketAddress) {
String host = ((InetSocketAddress) address).getHostName();
String port = Integer.toString(((InetSocketAddress) address).getPort());
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", port);
}
}
}
No, the Java ProxySelector does not read Proxy Auto-Config (PAC) files.
However, as suggested by Brian de Alwis as an answer to my similar question, the Proxy Vole library appears to provide that support/capability.
To provide network connectivity out of the box for you Java application you can use the Proxy - Vole library. It provides some strategies for autodetecting the current proxy settings. There are many configureable strategies to choose from. At the moment Proxy - Vole supports the following proxy detection strategies.
- Read platform settings (Supports: Windows, KDE, Gnome, OSX)
- Read browser setting (Supports: Firefox 3.x, Internet Explorer; Chrome and Webkit use the platform settings)
- Read environment variables (often used variables on Linux / Unix server systems)
- Autodetection script by using WPAD/PAC (Not all variations supported)
Yes, from version 9 automatic proxy configurations (PAC/WPAD) will be read from the operating system.