blob: 1504d55c416416936af029b0be9e318483ee46f6 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.net.impl;
import org.chromium.net.NetworkException;
/** Implements {@link NetworkException}. */
public class NetworkExceptionImpl extends NetworkException {
// Error code, one of ERROR_*
protected final int mErrorCode;
// Cronet internal error code.
protected final int mCronetInternalErrorCode;
/**
* Constructs an exception with a specific error.
*
* @param message explanation of failure.
* @param errorCode error code, one of {@link #ERROR_HOSTNAME_NOT_RESOLVED ERROR_*}.
* @param cronetInternalErrorCode Cronet internal error code, one of
* <a href=https://chromium.googlesource.com/chromium/src/+/main/net/base/net_error_list.h>
* these</a>.
*/
public NetworkExceptionImpl(String message, int errorCode, int cronetInternalErrorCode) {
super(message, null);
assert errorCode > 0 && errorCode < 12;
assert cronetInternalErrorCode < 0;
mErrorCode = errorCode;
mCronetInternalErrorCode = cronetInternalErrorCode;
}
@Override
public int getErrorCode() {
return mErrorCode;
}
@Override
public int getCronetInternalErrorCode() {
return mCronetInternalErrorCode;
}
@Override
public boolean immediatelyRetryable() {
switch (mErrorCode) {
case ERROR_HOSTNAME_NOT_RESOLVED:
case ERROR_INTERNET_DISCONNECTED:
case ERROR_CONNECTION_REFUSED:
case ERROR_ADDRESS_UNREACHABLE:
case ERROR_OTHER:
default:
return false;
case ERROR_NETWORK_CHANGED:
case ERROR_TIMED_OUT:
case ERROR_CONNECTION_CLOSED:
case ERROR_CONNECTION_TIMED_OUT:
case ERROR_CONNECTION_RESET:
return true;
}
}
@Override
public String getMessage() {
StringBuilder b = new StringBuilder(super.getMessage());
b.append(", ErrorCode=").append(mErrorCode);
if (mCronetInternalErrorCode != 0) {
b.append(", InternalErrorCode=").append(mCronetInternalErrorCode);
}
b.append(", Retryable=").append(immediatelyRetryable());
return b.toString();
}
}