diff options
author | Jason Monk <jmonk@google.com> | 2014-08-18 13:32:34 -0400 |
---|---|---|
committer | Jason Monk <jmonk@google.com> | 2014-08-20 12:21:56 -0400 |
commit | 4385af32eff1b99802e6ce233a2b10d002bf4eb1 (patch) | |
tree | 509ae77c6d143858beb2e9c5ea0719c7474c9f50 /core/java/android/net | |
parent | 03374ccc4c29117c8b672b740a0cede2fd8afb52 (diff) | |
download | frameworks_base-4385af32eff1b99802e6ce233a2b10d002bf4eb1.zip frameworks_base-4385af32eff1b99802e6ce233a2b10d002bf4eb1.tar.gz frameworks_base-4385af32eff1b99802e6ce233a2b10d002bf4eb1.tar.bz2 |
Fix SOCKS proxies from being dropped from PAC
It seems that SOCKS isn't being handled explicitly by the
PacProxySelector, which results in them just being dropped
from the return list. This will sometimes end up switching
from SOCKS to DIRECT, which could be bad.
Bug: 17104885
Change-Id: Ic8a28230d3ae18c0abb000811a9100787c10c5e0
Diffstat (limited to 'core/java/android/net')
-rw-r--r-- | core/java/android/net/PacProxySelector.java | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/core/java/android/net/PacProxySelector.java b/core/java/android/net/PacProxySelector.java index 8a2c2b6..8626d08 100644 --- a/core/java/android/net/PacProxySelector.java +++ b/core/java/android/net/PacProxySelector.java @@ -39,6 +39,9 @@ import java.util.List; public class PacProxySelector extends ProxySelector { private static final String TAG = "PacProxySelector"; public static final String PROXY_SERVICE = "com.android.net.IProxyService"; + private static final String SOCKS = "SOCKS "; + private static final String PROXY = "PROXY "; + private IProxyService mProxyService; private final List<Proxy> mDefaultList; @@ -88,16 +91,16 @@ public class PacProxySelector extends ProxySelector { String trimmed = s.trim(); if (trimmed.equals("DIRECT")) { ret.add(java.net.Proxy.NO_PROXY); - } else if (trimmed.startsWith("PROXY ")) { - String[] hostPort = trimmed.substring(6).split(":"); - String host = hostPort[0]; - int port; - try { - port = Integer.parseInt(hostPort[1]); - } catch (Exception e) { - port = 8080; + } else if (trimmed.startsWith(PROXY)) { + Proxy proxy = proxyFromHostPort(Type.HTTP, trimmed.substring(PROXY.length())); + if (proxy != null) { + ret.add(proxy); + } + } else if (trimmed.startsWith(SOCKS)) { + Proxy proxy = proxyFromHostPort(Type.SOCKS, trimmed.substring(SOCKS.length())); + if (proxy != null) { + ret.add(proxy); } - ret.add(new Proxy(Type.HTTP, InetSocketAddress.createUnresolved(host, port))); } } if (ret.size() == 0) { @@ -106,6 +109,18 @@ public class PacProxySelector extends ProxySelector { return ret; } + private static Proxy proxyFromHostPort(Proxy.Type type, String hostPortString) { + try { + String[] hostPort = hostPortString.split(":"); + String host = hostPort[0]; + int port = Integer.parseInt(hostPort[1]); + return new Proxy(type, InetSocketAddress.createUnresolved(host, port)); + } catch (NumberFormatException|ArrayIndexOutOfBoundsException e) { + Log.d(TAG, "Unable to parse proxy " + hostPortString + " " + e); + return null; + } + } + @Override public void connectFailed(URI uri, SocketAddress address, IOException failure) { |