Add 'src/be/nikiroo/utils/' from commit '46add0670fdee4bd936a13fe2448c5e20a7ffd0a'
[fanfix.git] / src / be / nikiroo / utils / Proxy.java
diff --git a/src/be/nikiroo/utils/Proxy.java b/src/be/nikiroo/utils/Proxy.java
new file mode 100644 (file)
index 0000000..750b3ee
--- /dev/null
@@ -0,0 +1,150 @@
+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:
+        * <ul>
+        * <li><tt>((user(:pass)@)proxy:port)</tt></li>
+        * <li>System proxy is noted <tt>:</tt></li>
+        * </ul>
+        * Some examples:
+        * <ul>
+        * <li><tt></tt> → do not use any proxy</li>
+        * <li><tt>:</tt> → use the system proxy</li>
+        * <li><tt>user@prox.com</tt> → use the proxy "prox.com" with default port
+        * and user "user"</li>
+        * <li><tt>prox.com:8080</tt> → use the proxy "prox.com" on port 8080</li>
+        * <li><tt>user:pass@prox.com:8080</tt> → use "prox.com" on port 8080
+        * authenticated as "user" with password "pass"</li>
+        * <li><tt>user:pass@:</tt> → use the system proxy authenticated as user
+        * "user" with password "pass"</li>
+        * </ul>
+        * 
+        * @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);
+               }
+       }
+}