aboutsummaryrefslogtreecommitdiffstats
path: root/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java
diff options
context:
space:
mode:
Diffstat (limited to 'netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java')
-rw-r--r--netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java79
1 files changed, 71 insertions, 8 deletions
diff --git a/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java b/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java
index cf7d6a8..db5a9b7 100644
--- a/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java
@@ -16,7 +16,6 @@
package net.sourceforge.jnlp.runtime;
-import static net.sourceforge.jnlp.runtime.Translator.R;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -52,6 +51,8 @@ public abstract class JNLPProxySelector extends ProxySelector {
/** The default port to use as a fallback. Currently squid's default port */
public static final int FALLBACK_PROXY_PORT = 3128;
+ private PacEvaluator pacEvaluator = null;
+
/** The proxy type. See PROXY_TYPE_* constants */
private int proxyType = PROXY_TYPE_UNKNOWN;
@@ -96,8 +97,7 @@ public abstract class JNLPProxySelector extends ProxySelector {
proxyType = Integer.valueOf(config.getProperty(DeploymentConfiguration.KEY_PROXY_TYPE));
- String autoConfigString = config
- .getProperty(DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL);
+ String autoConfigString = config.getProperty(DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL);
if (autoConfigString != null) {
try {
autoConfigUrl = new URL(autoConfigString);
@@ -106,6 +106,10 @@ public abstract class JNLPProxySelector extends ProxySelector {
}
}
+ if (autoConfigUrl != null) {
+ pacEvaluator = PacEvaluatorFactory.getPacEvaluator(autoConfigUrl);
+ }
+
bypassList = new ArrayList<String>();
String proxyBypass = config.getProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LIST);
if (proxyBypass != null) {
@@ -333,14 +337,22 @@ public abstract class JNLPProxySelector extends ProxySelector {
*
* @return a List of valid Proxy objects
*/
- private List<Proxy> getFromPAC(URI uri) {
- if (autoConfigUrl == null) {
+ protected List<Proxy> getFromPAC(URI uri) {
+ if (autoConfigUrl == null || uri.getScheme().equals("socket")) {
return Arrays.asList(new Proxy[] { Proxy.NO_PROXY });
}
- // TODO implement this by reading and using the PAC file
- System.err.println(R("RPRoxyPacNotImplemented"));
- return Arrays.asList(new Proxy[] { Proxy.NO_PROXY });
+ List<Proxy> proxies = new ArrayList<Proxy>();
+
+ try {
+ String proxiesString = pacEvaluator.getProxies(uri.toURL());
+ proxies.addAll(getProxiesFromPacResult(proxiesString));
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ proxies.add(Proxy.NO_PROXY);
+ }
+
+ return proxies;
}
/**
@@ -351,5 +363,56 @@ public abstract class JNLPProxySelector extends ProxySelector {
*/
protected abstract List<Proxy> getFromBrowser(URI uri);
+ /**
+ * Converts a proxy string from a browser into a List of Proxy objects
+ * suitable for java.
+ * @param pacString a string indicating proxies. For example
+ * "PROXY foo.bar:3128; DIRECT"
+ * @return a list of Proxy objects represeting the parsed string.
+ */
+ public static List<Proxy> getProxiesFromPacResult(String pacString) {
+ List<Proxy> proxies = new ArrayList<Proxy>();
+
+ String[] tokens = pacString.split(";");
+ for (String token: tokens) {
+ if (token.startsWith("PROXY")) {
+ String hostPortPair = token.substring("PROXY".length()).trim();
+ if (!hostPortPair.contains(":")) {
+ continue;
+ }
+ String host = hostPortPair.split(":")[0];
+ int port;
+ try {
+ port = Integer.valueOf(hostPortPair.split(":")[1]);
+ } catch (NumberFormatException nfe) {
+ continue;
+ }
+ SocketAddress sa = new InetSocketAddress(host, port);
+ proxies.add(new Proxy(Type.HTTP, sa));
+ } else if (token.startsWith("SOCKS")) {
+ String hostPortPair = token.substring("SOCKS".length()).trim();
+ if (!hostPortPair.contains(":")) {
+ continue;
+ }
+ String host = hostPortPair.split(":")[0];
+ int port;
+ try {
+ port = Integer.valueOf(hostPortPair.split(":")[1]);
+ } catch (NumberFormatException nfe) {
+ continue;
+ }
+ SocketAddress sa = new InetSocketAddress(host, port);
+ proxies.add(new Proxy(Type.SOCKS, sa));
+ } else if (token.startsWith("DIRECT")) {
+ proxies.add(Proxy.NO_PROXY);
+ } else {
+ if (JNLPRuntime.isDebug()) {
+ System.out.println("Unrecognized proxy token: " + token);
+ }
+ }
+ }
+
+ return proxies;
+ }
}