Lines
0 %
Functions
Branches
100 %
//! Helpers for reporting Arti errors via HTTP protocols.
use super::ErrorKind;
use http::StatusCode;
impl ErrorKind {
/// Return an HTTP status code corresponding to this `ErrorKind`.
///
/// These HTTP status codes are used by Arti in reply to client requests
/// on the HTTP CONNECT proxy port.
/// The specific status code for a given ErrorKind is _not_ formally specified.
/// As such, it is okay to change them to be more appropriate.
/// These codes are not guaranteed to be the same across different versions of `tor-error`.
//
// NOTE: One reason this method is in `tor-error` is to ensure that the match can remain
// exhaustive. Don't add a `_ =>` at the end!
pub fn http_status_code(self) -> StatusCode {
use ErrorKind as EK;
use http::StatusCode as SC;
match self {
EK::ArtiShuttingDown
| EK::BadApiUsage
| EK::BootstrapRequired
| EK::CacheAccessFailed
| EK::CacheCorrupted
| EK::ClockSkew
| EK::DirectoryExpired
| EK::ExternalToolFailed
| EK::FsPermissions
| EK::Internal
| EK::InvalidConfig
| EK::InvalidConfigTransition
| EK::KeystoreAccessFailed
| EK::KeystoreCorrupted
| EK::NoHomeDirectory
| EK::Other
| EK::PersistentStateAccessFailed
| EK::PersistentStateCorrupted
| EK::SoftwareDeprecated
| EK::TorDirectoryUnusable
| EK::TransientFailure
| EK::ReactorShuttingDown
| EK::RelayIdMismatch
| EK::RelayTooBusy
| EK::TorAccessFailed
| EK::TorDirectoryError => SC::INTERNAL_SERVER_ERROR,
EK::FeatureDisabled | EK::NotImplemented => SC::NOT_IMPLEMENTED,
EK::CircuitCollapse
| EK::CircuitRefused
| EK::ExitPolicyRejected
| EK::LocalNetworkError
| EK::LocalProtocolViolation
| EK::LocalResourceAlreadyInUse
| EK::LocalResourceExhausted
| EK::NoExit
| EK::NoPath => SC::SERVICE_UNAVAILABLE,
EK::TorProtocolViolation | EK::RemoteProtocolViolation | EK::RemoteNetworkFailed => {
SC::BAD_GATEWAY
}
EK::ExitTimeout | EK::TorNetworkTimeout | EK::RemoteNetworkTimeout => {
SC::GATEWAY_TIMEOUT
EK::ForbiddenStreamTarget => SC::FORBIDDEN,
EK::OnionServiceAddressInvalid | EK::InvalidStreamTarget => SC::BAD_REQUEST,
EK::OnionServiceWrongClientAuth => SC::FORBIDDEN,
EK::OnionServiceConnectionFailed
| EK::OnionServiceMissingClientAuth
| EK::OnionServiceNotFound
| EK::OnionServiceNotRunning
| EK::OnionServiceProtocolViolation => SC::SERVICE_UNAVAILABLE,
EK::RemoteConnectionRefused
| EK::RemoteHostNotFound
| EK::RemoteHostResolutionFailed
| EK::RemoteStreamClosed
| EK::RemoteStreamError
| EK::RemoteStreamReset => SC::SERVICE_UNAVAILABLE,
// NOTE: Do not add a `_ =>` catch-all here; see NOTE above.