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