1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.android_webview;
6
7import org.chromium.net.NetError;
8
9/**
10 * This is a helper class to map native error code about loading a page to Android specific ones.
11 */
12public abstract class ErrorCodeConversionHelper {
13    // Success
14    public static final int ERROR_OK = 0;
15    // Generic error
16    public static final int ERROR_UNKNOWN = -1;
17    // Server or proxy hostname lookup failed
18    public static final int ERROR_HOST_LOOKUP = -2;
19    // Unsupported authentication scheme (not basic or digest)
20    public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3;
21    // User authentication failed on server
22    public static final int ERROR_AUTHENTICATION = -4;
23    // User authentication failed on proxy
24    public static final int ERROR_PROXY_AUTHENTICATION = -5;
25    // Failed to connect to the server
26    public static final int ERROR_CONNECT = -6;
27    // Failed to read or write to the server
28    public static final int ERROR_IO = -7;
29    // Connection timed out
30    public static final int ERROR_TIMEOUT = -8;
31    // Too many redirects
32    public static final int ERROR_REDIRECT_LOOP = -9;
33    // Unsupported URI scheme
34    public static final int ERROR_UNSUPPORTED_SCHEME = -10;
35    // Failed to perform SSL handshake
36    public static final int ERROR_FAILED_SSL_HANDSHAKE = -11;
37    // Malformed URL
38    public static final int ERROR_BAD_URL = -12;
39    // Generic file error
40    public static final int ERROR_FILE = -13;
41    // File not found
42    public static final int ERROR_FILE_NOT_FOUND = -14;
43    // Too many requests during this load
44    public static final int ERROR_TOO_MANY_REQUESTS = -15;
45
46    static int convertErrorCode(int netError) {
47        // Note: many NetError.Error constants don't have an obvious mapping.
48        // These will be handled by the default case, ERROR_UNKNOWN.
49        switch (netError) {
50            case NetError.ERR_UNSUPPORTED_AUTH_SCHEME:
51                return ERROR_UNSUPPORTED_AUTH_SCHEME;
52
53            case NetError.ERR_INVALID_AUTH_CREDENTIALS:
54            case NetError.ERR_MISSING_AUTH_CREDENTIALS:
55            case NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT:
56                return ERROR_AUTHENTICATION;
57
58            case NetError.ERR_TOO_MANY_REDIRECTS:
59                return ERROR_REDIRECT_LOOP;
60
61            case NetError.ERR_UPLOAD_FILE_CHANGED:
62                return ERROR_FILE_NOT_FOUND;
63
64            case NetError.ERR_INVALID_URL:
65                return ERROR_BAD_URL;
66
67            case NetError.ERR_DISALLOWED_URL_SCHEME:
68            case NetError.ERR_UNKNOWN_URL_SCHEME:
69                return ERROR_UNSUPPORTED_SCHEME;
70
71            case NetError.ERR_IO_PENDING:
72            case NetError.ERR_NETWORK_IO_SUSPENDED:
73                return ERROR_IO;
74
75            case NetError.ERR_CONNECTION_TIMED_OUT:
76            case NetError.ERR_TIMED_OUT:
77                return ERROR_TIMEOUT;
78
79            case NetError.ERR_FILE_TOO_BIG:
80                return ERROR_FILE;
81
82            case NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE:
83            case NetError.ERR_INSUFFICIENT_RESOURCES:
84            case NetError.ERR_OUT_OF_MEMORY:
85                return ERROR_TOO_MANY_REQUESTS;
86
87            case NetError.ERR_CONNECTION_CLOSED:
88            case NetError.ERR_CONNECTION_RESET:
89            case NetError.ERR_CONNECTION_REFUSED:
90            case NetError.ERR_CONNECTION_ABORTED:
91            case NetError.ERR_CONNECTION_FAILED:
92            case NetError.ERR_SOCKET_NOT_CONNECTED:
93                return ERROR_CONNECT;
94
95            case NetError.ERR_INTERNET_DISCONNECTED:
96            case NetError.ERR_ADDRESS_INVALID:
97            case NetError.ERR_ADDRESS_UNREACHABLE:
98            case NetError.ERR_NAME_NOT_RESOLVED:
99            case NetError.ERR_NAME_RESOLUTION_FAILED:
100                return ERROR_HOST_LOOKUP;
101
102            case NetError.ERR_SSL_PROTOCOL_ERROR:
103            case NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED:
104            case NetError.ERR_TUNNEL_CONNECTION_FAILED:
105            case NetError.ERR_NO_SSL_VERSIONS_ENABLED:
106            case NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
107            case NetError.ERR_SSL_RENEGOTIATION_REQUESTED:
108            case NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION:
109            case NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT:
110            case NetError.ERR_SSL_NO_RENEGOTIATION:
111            case NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT:
112            case NetError.ERR_SSL_BAD_RECORD_MAC_ALERT:
113            case NetError.ERR_SSL_UNSAFE_NEGOTIATION:
114            case NetError.ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
115            case NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED:
116            case NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY:
117                return ERROR_FAILED_SSL_HANDSHAKE;
118
119            case NetError.ERR_PROXY_AUTH_UNSUPPORTED:
120            case NetError.ERR_PROXY_AUTH_REQUESTED:
121            case NetError.ERR_PROXY_CONNECTION_FAILED:
122            case NetError.ERR_UNEXPECTED_PROXY_AUTH:
123                return ERROR_PROXY_AUTHENTICATION;
124
125            // The certificate errors are handled by onReceivedSslError
126            // and don't need to be reported here.
127            case NetError.ERR_CERT_COMMON_NAME_INVALID:
128            case NetError.ERR_CERT_DATE_INVALID:
129            case NetError.ERR_CERT_AUTHORITY_INVALID:
130            case NetError.ERR_CERT_CONTAINS_ERRORS:
131            case NetError.ERR_CERT_NO_REVOCATION_MECHANISM:
132            case NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
133            case NetError.ERR_CERT_REVOKED:
134            case NetError.ERR_CERT_INVALID:
135            case NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
136            case NetError.ERR_CERT_NON_UNIQUE_NAME:
137                return ERROR_OK;
138
139            default:
140                return ERROR_UNKNOWN;
141        }
142    }
143}
144