package be.nikiroo.utils;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
/**
* Simple proxy helper to select a default internet proxy.
*
* @author niki
*/
public class Proxy {
/**
* Use the proxy described by this string:
*
* - ((user(:pass)@)proxy:port)
* - System proxy is noted :
*
* Some examples:
*
* - → do not use any proxy
* - : → use the system proxy
* - user@prox.com → use the proxy "prox.com" with default port
* and user "user"
* - prox.com:8080 → use the proxy "prox.com" on port 8080
* - user:pass@prox.com:8080 → use "prox.com" on port 8080
* authenticated as "user" with password "pass"
* - user:pass@: → use the system proxy authenticated as user
* "user" with password "pass"
*
*
* @param proxy
* the proxy
*/
static public void use(String proxy) {
if (proxy != null && !proxy.isEmpty()) {
String user = null;
String password = null;
int port = 8080;
if (proxy.contains("@")) {
int pos = proxy.indexOf("@");
user = proxy.substring(0, pos);
proxy = proxy.substring(pos + 1);
if (user.contains(":")) {
pos = user.indexOf(":");
password = user.substring(pos + 1);
user = user.substring(0, pos);
}
}
if (proxy.equals(":")) {
proxy = null;
} else if (proxy.contains(":")) {
int pos = proxy.indexOf(":");
try {
port = Integer.parseInt(proxy.substring(0, pos));
proxy = proxy.substring(pos + 1);
} catch (Exception e) {
}
}
if (proxy == null) {
Proxy.useSystemProxy(user, password);
} else {
Proxy.useProxy(proxy, port, user, password);
}
}
}
/**
* Use the system proxy.
*/
static public void useSystemProxy() {
useSystemProxy(null, null);
}
/**
* Use the system proxy with the given login/password, for authenticated
* proxies.
*
* @param user
* the user name or login
* @param password
* the password
*/
static public void useSystemProxy(String user, String password) {
System.setProperty("java.net.useSystemProxies", "true");
auth(user, password);
}
/**
* Use the give proxy.
*
* @param host
* the proxy host name or IP address
* @param port
* the port to use
*/
static public void useProxy(String host, int port) {
useProxy(host, port, null, null);
}
/**
* Use the given proxy with the given login/password, for authenticated
* proxies.
*
* @param user
* the user name or login
* @param password
* the password
* @param host
* the proxy host name or IP address
* @param port
* the port to use
* @param user
* the user name or login
* @param password
* the password
*/
static public void useProxy(String host, int port, String user,
String password) {
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", Integer.toString(port));
auth(user, password);
}
/**
* Select the default authenticator for proxy requests.
*
* @param user
* the user name or login
* @param password
* the password
*/
static private void auth(final String user, final String password) {
if (user != null && password != null) {
Authenticator proxy = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY) {
return new PasswordAuthentication(user,
password.toCharArray());
}
return null;
}
};
Authenticator.setDefault(proxy);
}
}
}