SslError.java revision 1abd5b3e6f11ef9d7076685c56ef942fa0dd77e4
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/** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * One or more individual SSL errors and the associated SSL certificate 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SslError { 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Individual SSL errors (in the order from the least to the most severe): 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The certificate is not yet valid 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 331abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_NOTYETVALID = 0; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The certificate has expired 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SSL_EXPIRED = 1; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hostname mismatch 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SSL_IDMISMATCH = 2; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The certificate authority is not trusted 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SSL_UNTRUSTED = 3; 461abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen /** 471abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * The date of the certificate is invalid 481abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen */ 491abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_DATE_INVALID = 4; 501abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen /** 511abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * The certificate is invalid 521abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen */ 531abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_INVALID = 5; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of different SSL errors (update if you add a new SSL error!!!) 581abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @deprecated This constant is not necessary for using the SslError API and 591abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * can change from release to release. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 611abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen @Deprecated 621abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static final int SSL_MAX_ERROR = 6; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SSL error set bitfield (each individual error is an bit index; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiple individual errors can be OR-ed) 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mErrors; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SSL certificate associated with the error set 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 735bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu final SslCertificate mCertificate; 745bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 755bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 765bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * The URL associated with the error set. 775bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 785bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu final String mUrl; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new SSL error set object 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param certificate The associated SSL certificate 845bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @deprecated Use {@link #SslError(int, SslCertificate, String)} 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 865bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu @Deprecated 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SslError(int error, SslCertificate certificate) { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addError(error); 895bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu if (certificate == null) { 905bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu throw new NullPointerException("certificate is null."); 915bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCertificate = certificate; 935bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mUrl = ""; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new SSL error set object 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param certificate The associated SSL certificate 1005bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @deprecated Use {@link #SslError(int, X509Certificate, String)} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1025bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu @Deprecated 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SslError(int error, X509Certificate certificate) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addError(error); 1055bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu if (certificate == null) { 1065bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu throw new NullPointerException("certificate is null."); 1075bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCertificate = new SslCertificate(certificate); 1095bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mUrl = ""; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1135bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * Creates a new SSL error set object 1145bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param error The SSL error 1155bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param certificate The associated SSL certificate 1165bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param url The associated URL. 1175bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 1185bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu public SslError(int error, SslCertificate certificate, String url) { 1195bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu addError(error); 1205bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu if (certificate == null) { 1215bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu throw new NullPointerException("certificate is null."); 1225bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1235bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mCertificate = certificate; 1245bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu if (url == null) { 1255bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu throw new NullPointerException("url is null."); 1265bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1275bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mUrl = url; 1285bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1295bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 1305bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 1311abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * Creates an SslError object from a chromium error code. 1321abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @param error The chromium error code 1331abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @param certificate The associated SSL certificate 1341abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @param url The associated URL. 1351abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen * @hide chromium error codes only available inside the framework 1361abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen */ 1371abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen public static SslError SslErrorFromChromiumErrorCode( 1381abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen int error, SslCertificate cert, String url) { 1391abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen // The chromium error codes are in: 1401abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen // external/chromium/net/base/net_error_list.h 1411abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen if (error > -200 || error < -299) { 1421abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen throw new NullPointerException("Not a valid chromium SSL error code."); 1431abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen } 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); 1501abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen // Map all other errors to SSL_INVALID 1511abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen return new SslError(SSL_INVALID, cert, url); 1521abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen } 1531abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen 1541abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen /** 1555bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * Creates a new SSL error set object 1565bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param error The SSL error 1575bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param certificate The associated SSL certificate 1585bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @param url The associated URL. 1595bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 1605bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu public SslError(int error, X509Certificate certificate, String url) { 1615bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu addError(error); 1625bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu if (certificate == null) { 1635bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu throw new NullPointerException("certificate is null."); 1645bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1655bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mCertificate = new SslCertificate(certificate); 1665bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu if (url == null) { 1675bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu throw new NullPointerException("url is null."); 1685bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1695bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu mUrl = url; 1705bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1715bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 1725bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 1735bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @return The SSL certificate associated with the error set, non-null. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SslCertificate getCertificate() { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCertificate; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1805bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * @return The URL associated with the error set, non-null. 1815bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu * "" if one of the deprecated constructors is used. 1825bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu */ 1835bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu public String getUrl() { 1845bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu return mUrl; 1855bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu } 1865bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu 1875bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu /** 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds the SSL error to the error set 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error to add 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True iff the error being added is a known SSL error 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean addError(int error) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rval) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mErrors |= (0x1 << error); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rval; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param error The SSL error to check 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True iff the set includes the error 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasError(int error) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rval) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rval = ((mErrors & (0x1 << error)) != 0); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rval; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The primary, most severe, SSL error in the set 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPrimaryError() { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mErrors != 0) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // go from the most to the least severe errors 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int error = SslError.SSL_MAX_ERROR - 1; error >= 0; --error) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mErrors & (0x1 << error)) != 0) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return error; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A String representation of this SSL error object 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (used mostly for debugging). 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "primary error: " + getPrimaryError() + 2365bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu " certificate: " + getCertificate() + 2375bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu " on URL: " + getUrl(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 240