19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.http.*; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.*; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Assert; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Network { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOGTAG = "network"; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Static instance of a Network object. 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Network sNetwork; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag to store the state of platform notifications, for the case 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the Network object has not been constructed yet 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean sPlatformNotifications; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference count for platform notifications as the network class is a 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * static and can exist over multiple activities, thus over multiple 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onPause/onResume pairs. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int sPlatformNotificationEnableRefCount; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Proxy username if known (used for pre-emptive proxy authentication). 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mProxyUsername; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Proxy password if known (used for pre-emptive proxy authentication). 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mProxyPassword; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Network request queue (requests are added from the browser thread). 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RequestQueue mRequestQueue; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SSL error handler: takes care of synchronization of multiple async 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loaders with SSL-related problems. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SslErrorHandler mSslErrorHandler; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HTTP authentication handler: takes care of synchronization of HTTP 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * authentication requests. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private HttpAuthHandler mHttpAuthHandler; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The singleton instance of the network. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static synchronized Network getInstance(Context context) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sNetwork == null) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note Context of the Application is used here, rather than 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the what is passed in (usually a Context derived from an 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Activity) so the intent receivers belong to the application 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // rather than an activity - this fixes the issue where 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Activities are created and destroyed during the lifetime of 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an Application 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sNetwork = new Network(context.getApplicationContext()); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sPlatformNotifications) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Adjust the ref count before calling enable as it is already 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // taken into account when the static function was called 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // directly 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project --sPlatformNotificationEnableRefCount; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enablePlatformNotifications(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sNetwork; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enables data state and proxy tracking 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void enablePlatformNotifications() { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (++sPlatformNotificationEnableRefCount == 1) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sNetwork != null) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sNetwork.mRequestQueue.enablePlatformNotifications(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sPlatformNotifications = true; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If platform notifications are enabled, this should be called 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from onPause() or onStop() 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void disablePlatformNotifications() { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--sPlatformNotificationEnableRefCount == 0) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sNetwork != null) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sNetwork.mRequestQueue.disablePlatformNotifications(); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sPlatformNotifications = false; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new Network object. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XXX: Must be created in the same thread as WebCore!!!!! 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Network(Context context) { 1352e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Assert.assertTrue(Thread.currentThread(). 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getName().equals(WebViewCore.THREAD_NAME)); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 139a589419c04f278a5d94811091a1100d284f3f2ecCary Clark mSslErrorHandler = new SslErrorHandler(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHttpAuthHandler = new HttpAuthHandler(this); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestQueue = new RequestQueue(context); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request a url from either the network or the file system. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url to load. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param method The http method. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param headers The http headers. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param postData The body of the request. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loader A LoadListener for receiving the results of the request. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the request was successfully queued. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean requestURL(String method, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, String> headers, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte [] postData, 157fe4fec7c66b0d956f008ead0fd899b588cfacb5dPatrick Scott LoadListener loader) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String url = loader.url(); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Not a valid url, return false because we won't service the request! 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!URLUtil.isValidUrl(url)) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 166bd5c823e28d907d85b8d0867133343ccda014451Grace Kloba // asset, res, file system or data stream are handled in the other code 167bd5c823e28d907d85b8d0867133343ccda014451Grace Kloba // path. This only handles network request. 168bd5c823e28d907d85b8d0867133343ccda014451Grace Kloba if (URLUtil.isAssetUrl(url) || URLUtil.isResourceUrl(url) 169bd5c823e28d907d85b8d0867133343ccda014451Grace Kloba || URLUtil.isFileUrl(url) || URLUtil.isDataUrl(url)) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* FIXME: this is lame. Pass an InputStream in, rather than 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project making this lame one here */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream bodyProvider = null; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bodyLength = 0; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postData != null) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bodyLength = postData.length; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bodyProvider = new ByteArrayInputStream(postData); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RequestQueue q = mRequestQueue; 18386806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott RequestHandle handle = null; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loader.isSynchronous()) { 18586806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott handle = q.queueSynchronousRequest(url, loader.getWebAddress(), 18686806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott method, headers, loader, bodyProvider, bodyLength); 18786806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott loader.attachRequestHandle(handle); 18886806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott handle.processRequest(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loader.loadSynchronousMessages(); 19086806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott } else { 19186806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott handle = q.queueRequest(url, loader.getWebAddress(), method, 19286806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott headers, loader, bodyProvider, bodyLength); 19386806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott // FIXME: Although this is probably a rare condition, normal network 19486806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott // requests are processed in a separate thread. This means that it 19586806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott // is possible to process part of the request before setting the 19686806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott // request handle on the loader. We should probably refactor this to 19786806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott // ensure the handle is attached before processing begins. 19886806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott loader.attachRequestHandle(handle); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20086806ce11a89260147d7c2efa2c192b711d923dbPatrick Scott 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True iff there is a valid proxy set. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isValidProxySet() { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The proxy host and port can be set within a different thread during 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an Intent broadcast. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRequestQueue) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRequestQueue.getProxyHost() != null; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the proxy hostname. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The proxy hostname obtained from the network queue and proxy 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getProxyHostname() { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRequestQueue.getProxyHost().getHostName(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The proxy username or null if none. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized String getProxyUsername() { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProxyUsername; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the proxy username. 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param proxyUsername Username to use when 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connecting through the proxy. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setProxyUsername(String proxyUsername) { 2372e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Assert.assertTrue(isValidProxySet()); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProxyUsername = proxyUsername; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The proxy password or null if none. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized String getProxyPassword() { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProxyPassword; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the proxy password. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param proxyPassword Password to use when 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connecting through the proxy. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setProxyPassword(String proxyPassword) { 2572e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Assert.assertTrue(isValidProxySet()); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProxyPassword = proxyPassword; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Saves the state of network handlers (user SSL and HTTP-authentication 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences). 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outState The out-state to save (write) to. 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True iff succeeds. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveState(Bundle outState) { 2712e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(LOGTAG, "Network.saveState()"); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSslErrorHandler.saveState(outState); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Restores the state of network handlers (user SSL and HTTP-authentication 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences). 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param inState The in-state to load (read) from. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True iff succeeds. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean restoreState(Bundle inState) { 2852e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(LOGTAG, "Network.restoreState()"); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSslErrorHandler.restoreState(inState); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears user SSL-error preference table. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearUserSslPrefTable() { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSslErrorHandler.clear(); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handles SSL error(s) on the way up to the user: the user must decide 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether errors should be ignored or not. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loader The loader that resulted in SSL errors. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleSslErrorRequest(LoadListener loader) { 3052e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) Assert.assertNotNull(loader); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loader != null) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSslErrorHandler.handleSslErrorRequest(loader); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3114e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott /* package */ boolean checkSslPrefTable(LoadListener loader, 3124e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott SslError error) { 3134e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott if (loader != null && error != null) { 3144e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott return mSslErrorHandler.checkSslPrefTable(loader, error); 3154e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott } 3164e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott return false; 3174e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott } 3184e9718d6ae3433a3f78fddf158a15701101ba781Patrick Scott 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handles authentication requests on their way up to the user (the user 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must provide credentials). 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loader The loader that resulted in an HTTP 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * authentication request. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleAuthRequest(LoadListener loader) { 3262e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.NETWORK) Assert.assertNotNull(loader); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loader != null) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHttpAuthHandler.handleAuthRequest(loader); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Performance probe 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startTiming() { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestQueue.startTiming(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopTiming() { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestQueue.stopTiming(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 341