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

Commit 2986f858 authored by Andreas Sandblad's avatar Andreas Sandblad Committed by Johan Redestig
Browse files

Added method getPreferredHttpHost

Added method for returning preferred proxy which takes both
localhost and Wi-Fi into account. This is a convenient method
to clients which only wants to set a correct proxy and don't
want to build in dependency to if Wi-Fi is active or not.
Currently no Wi-Fi proxy is supported by the system, but once
added, this method could return a suitable proxy for Wi-Fi.

Change-Id: I8c9c2879351fd25a20ea82a2cb000f226248c357
parent 25940667
Loading
Loading
Loading
Loading
+80 −0
Original line number Diff line number Diff line
@@ -16,12 +16,20 @@

package android.net;

import org.apache.harmony.luni.platform.INetworkSystem;
import org.apache.harmony.luni.platform.Platform;
import org.apache.http.HttpHost;

import android.content.ContentResolver;
import android.content.Context;
import android.os.SystemProperties;
import android.provider.Settings;
import android.util.Log;

import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;

import junit.framework.Assert;

/**
@@ -36,6 +44,8 @@ final public class Proxy {
    static final public String PROXY_CHANGE_ACTION =
        "android.intent.action.PROXY_CHANGE";

    static final private INetworkSystem NETIMPL = Platform.getNetworkSystem();

    /**
     * Return the proxy host set by the user.
     * @param ctx A Context used to get the settings for the proxy host.
@@ -120,4 +130,74 @@ final public class Proxy {
        }
    }

    /**
     * Returns the preferred proxy to be used by clients. This is a wrapper
     * around {@link android.net.Proxy#getHost()}. Currently no proxy will
     * be returned for localhost or if the active network is Wi-Fi.
     *
     * @param context the context which will be passed to
     * {@link android.net.Proxy#getHost()}
     * @param url the target URL for the request
     * @note Calling this method requires permission
     * android.permission.ACCESS_NETWORK_STATE
     * @return The preferred proxy to be used by clients, or null if there
     * is no proxy.
     *
     * {@hide}
     */
    static final public HttpHost getPreferredHttpHost(Context context,
            String url) {
        if (!isLocalHost(url) && !isNetworkWifi(context)) {
            final String proxyHost = Proxy.getHost(context);
            if (proxyHost != null) {
                return new HttpHost(proxyHost, Proxy.getPort(context), "http");
            }
        }

        return null;
    }

    static final private boolean isLocalHost(String url) {
        if (url == null) {
            return false;
        }

        try {
            final URI uri = URI.create(url);
            final String host = uri.getHost();
            if (host != null) {
                if (host.equalsIgnoreCase("localhost")) {
                    return true;
                }
                if (InetAddress.getByAddress(NETIMPL.ipStringToByteArray(host))
                        .isLoopbackAddress()) {
                    return true;
                }
            }
        } catch (UnknownHostException uex) {
            // Ignore (INetworkSystem.ipStringToByteArray)
        } catch (IllegalArgumentException iex) {
            // Ignore (URI.create)
        }

        return false;
    }

    static final private boolean isNetworkWifi(Context context) {
        if (context == null) {
            return false;
        }

        final ConnectivityManager connectivity = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            final NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (info != null &&
                    info.getType() == ConnectivityManager.TYPE_WIFI) {
                return true;
            }
        }

        return false;
    }
};
+1 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- location test permissions -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+93 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.core;

import org.apache.http.HttpHost;

import android.content.Context;
import android.net.Proxy;
import android.test.AndroidTestCase;

/**
 * Proxy tests
 */
public class ProxyTest extends AndroidTestCase {
    private Context mContext;
    private HttpHost mHttpHost;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        mContext = getContext();
        mHttpHost = null;
        String proxyHost = Proxy.getHost(mContext);
        int proxyPort = Proxy.getPort(mContext);
        if (proxyHost != null) {
            mHttpHost = new HttpHost(proxyHost, proxyPort, "http");
        }
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    /**
     * Bad url parameter should not cause any exception.
     */
    public void testProxyGetPreferredHttpHost_UrlBad() throws Exception {
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, null));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, ""));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "bad:"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "bad"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "bad:\\"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "bad://#"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "://#"));
    }

    /**
     * Proxy (if available) should be returned when url parameter is not localhost.
     */
    public void testProxyGetPreferredHttpHost_UrlNotlLocalhost() throws Exception {
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "http://"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "http://example.com"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "http://example.com/"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "http://192.168.0.1/"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "file:///foo/bar"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "rtsp://example.com"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "rtsp://example.com/"));
        assertEquals(mHttpHost, Proxy.getPreferredHttpHost(mContext, "javascript:alert(1)"));
    }

    /**
     * No proxy should be returned when url parameter is localhost.
     */
    public void testProxyGetPreferredHttpHost_UrlLocalhost() throws Exception {
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://localhost"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://localhost/"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://localhost/hej.html"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://127.0.0.1"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://127.0.0.1/"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://127.0.0.1/hej.html"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://127.0.0.1:80/"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "http://127.0.0.1:8080/"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "rtsp://127.0.0.1/"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "rtsp://localhost/"));
        assertNull(Proxy.getPreferredHttpHost(mContext, "https://localhost/"));
    }
}