use std::fmt;
use std::time::Duration;
pub const MAX_ERROR_BODY_BYTES: usize = 64 * 1024;
#[derive(Debug)]
pub enum HttpError {
InvalidRequest(String),
Transport {
message: String,
connect_phase: bool,
},
Timeout(String),
Status {
status: u16,
body: String,
retry_after: Option<Duration>,
attempts: u32,
},
BodyTooLarge { limit: usize },
Json(String),
Stream(String),
}
impl HttpError {
pub fn status(&self) -> Option<u16> {
match self {
HttpError::Status { status, .. } => Some(*status),
_ => None,
}
}
}
impl fmt::Display for HttpError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HttpError::InvalidRequest(m) => write!(f, "invalid request: {m}"),
HttpError::Transport { message, .. } => write!(f, "transport error: {message}"),
HttpError::Timeout(m) => write!(f, "timeout: {m}"),
HttpError::Status {
status, attempts, ..
} => {
write!(f, "HTTP {status} after {attempts} attempt(s)")
}
HttpError::BodyTooLarge { limit } => write!(f, "response body exceeds {limit} bytes"),
HttpError::Json(m) => write!(f, "invalid JSON: {m}"),
HttpError::Stream(m) => write!(f, "stream error: {m}"),
}
}
}
impl std::error::Error for HttpError {}