Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4385af32 authored by Jason Monk's avatar Jason Monk
Browse files

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
parent 03374ccc
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -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) {