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.net.http; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.X509Certificate; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * This class represents a set of one or more SSL errors and the associated SSL 239e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * certificate. 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SslError { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Individual SSL errors (in the order from the least to the most severe): 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The certificate is not yet valid 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 341abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_NOTYETVALID = 0; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The certificate has expired 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SSL_EXPIRED = 1; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hostname mismatch 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SSL_IDMISMATCH = 2; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The certificate authority is not trusted 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SSL_UNTRUSTED = 3; 471abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen /** 481abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * The date of the certificate is invalid 491abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen */ 501abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_DATE_INVALID = 4; 511abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen /** 529e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * A generic error occurred 531abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen */ 541abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_INVALID = 5; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * The number of different SSL errors. 591abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @deprecated This constant is not necessary for using the SslError API and 601abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * can change from release to release. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block // Update if you add a new SSL error!!! 631abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen @Deprecated 641abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_MAX_ERROR = 6; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 67f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * The SSL error set bitfield (each individual error is a bit index; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiple individual errors can be OR-ed) 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mErrors; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SSL certificate associated with the error set 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 755bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu final SslCertificate mCertificate; 765bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 775bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 785bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * The URL associated with the error set. 795bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 805bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu final String mUrl; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Creates a new SslError object using the supplied error and certificate. 849e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * The URL will be set to the empty string. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param certificate The associated SSL certificate 875bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @deprecated Use {@link #SslError(int, SslCertificate, String)} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 895bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu @Deprecated 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SslError(int error, SslCertificate certificate) { 919e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block this(error, certificate, ""); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 959e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Creates a new SslError object using the supplied error and certificate. 969e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * The URL will be set to the empty string. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param certificate The associated SSL certificate 995bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @deprecated Use {@link #SslError(int, X509Certificate, String)} 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1015bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu @Deprecated 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SslError(int error, X509Certificate certificate) { 1039e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block this(error, certificate, ""); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Creates a new SslError object using the supplied error, certificate and 1089e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * URL. 1095bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param error The SSL error 1105bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param certificate The associated SSL certificate 1119e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @param url The associated URL 1125bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 1135bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu public SslError(int error, SslCertificate certificate, String url) { 1149e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block assert certificate != null; 1159e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block assert url != null; 1165bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu addError(error); 1175bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mCertificate = certificate; 1185bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mUrl = url; 1195bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1205bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 1215bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 1229e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Creates a new SslError object using the supplied error, certificate and 1239e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * URL. 1249e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @param error The SSL error 1259e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @param certificate The associated SSL certificate 1269e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @param url The associated URL 1279e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block */ 1289e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block public SslError(int error, X509Certificate certificate, String url) { 1299e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block this(error, new SslCertificate(certificate), url); 1309e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block } 1319e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block 1329e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block /** 1331abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * Creates an SslError object from a chromium error code. 1341abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @param error The chromium error code 1351abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @param certificate The associated SSL certificate 1361abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @param url The associated URL. 1371abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @hide chromium error codes only available inside the framework 1381abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen */ 1391abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static SslError SslErrorFromChromiumErrorCode( 1401abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen int error, SslCertificate cert, String url) { 1411abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen // The chromium error codes are in: 1421abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen // external/chromium/net/base/net_error_list.h 1439e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block assert (error >= -299 && error <= -200); 1441abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen if (error == -200) 1451abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen return new SslError(SSL_IDMISMATCH, cert, url); 1461abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen if (error == -201) 1471abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen return new SslError(SSL_DATE_INVALID, cert, url); 1481abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen if (error == -202) 1491abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen return new SslError(SSL_UNTRUSTED, cert, url); 1509e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block // Map all other codes to SSL_INVALID. 1511abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen return new SslError(SSL_INVALID, cert, url); 1521abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen } 1531abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen 1541abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen /** 1559e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Gets the SSL certificate associated with this object. 1569e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @return The SSL certificate, non-null. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SslCertificate getCertificate() { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCertificate; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Gets the URL associated with this object. 1649e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @return The URL, non-null. 1655bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 1665bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu public String getUrl() { 1675bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu return mUrl; 1685bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1695bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 1705bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 1719e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Adds the supplied SSL error to the set. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error to add 1739e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @return True if the error being added is a known SSL error, otherwise 1749e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * false. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean addError(int error) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rval) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mErrors |= (0x1 << error); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rval; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Determines whether this object includes the supplied error. 1879e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @param error The SSL error to check for 1889e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @return True if this object includes the error, otherwise false. 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasError(int error) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rval) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rval = ((mErrors & (0x1 << error)) != 0); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rval; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2009e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Gets the most severe SSL error in this object's set of errors. 201518f72ca38f4a5e1dfcfade6b40e4fd082dd9fd8Steve Block * Returns -1 if the set is empty. 202518f72ca38f4a5e1dfcfade6b40e4fd082dd9fd8Steve Block * @return The most severe SSL error, or -1 if the set is empty. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPrimaryError() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mErrors != 0) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // go from the most to the least severe errors 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int error = SslError.SSL_MAX_ERROR - 1; error >= 0; --error) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mErrors & (0x1 << error)) != 0) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return error; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 212518f72ca38f4a5e1dfcfade6b40e4fd082dd9fd8Steve Block // mErrors should never be set to an invalid value. 213518f72ca38f4a5e1dfcfade6b40e4fd082dd9fd8Steve Block assert false; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 216518f72ca38f4a5e1dfcfade6b40e4fd082dd9fd8Steve Block return -1; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2209e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * Returns a string representation of this object. 2219e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block * @return A String representation of this object. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "primary error: " + getPrimaryError() + 2259e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block " certificate: " + getCertificate() + 2269e334dbc308da119c7902a4badd2424adc5e9fb9Steve Block " on URL: " + getUrl(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 229