use crate::response::{ErrorBody, Response};
#[derive(Debug)]
pub struct HeaderError {
inner_error: Box<dyn std::error::Error + Send + Sync + 'static>,
}
impl HeaderError {
pub fn new(err: Box<dyn std::error::Error + Send + Sync + 'static>) -> Self {
HeaderError { inner_error: err }
}
}
impl std::fmt::Display for HeaderError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Invalid response header: {}", self.inner_error)
}
}
impl std::error::Error for HeaderError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
Some(self.inner_error.as_ref())
}
}
#[derive(Debug)]
pub enum Error {
TimedOut,
StreamClosed,
InvalidParameter(Box<dyn std::error::Error + Send + Sync + 'static>),
UnexpectedResponse(Response, ErrorBody),
HttpStream(Box<dyn std::error::Error + Send + Sync + 'static>),
Eof,
UnexpectedEof,
InvalidLine(String),
InvalidEvent,
MalformedLocationHeader(Box<dyn std::error::Error + Send + Sync + 'static>),
MaxRedirectLimitReached(u32),
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Error::*;
match self {
TimedOut => write!(f, "timed out"),
StreamClosed => write!(f, "stream closed"),
InvalidParameter(err) => write!(f, "invalid parameter: {err}"),
UnexpectedResponse(r, _) => {
let status = r.status();
write!(f, "unexpected response: {status}")
}
HttpStream(err) => write!(f, "http error: {err}"),
Eof => write!(f, "eof"),
UnexpectedEof => write!(f, "unexpected eof"),
InvalidLine(line) => write!(f, "invalid line: {line}"),
InvalidEvent => write!(f, "invalid event"),
MalformedLocationHeader(err) => write!(f, "malformed header: {err}"),
MaxRedirectLimitReached(limit) => write!(f, "maximum redirect limit reached: {limit}"),
}
}
}
impl std::error::Error for Error {}
impl PartialEq<Error> for Error {
fn eq(&self, other: &Error) -> bool {
use Error::*;
if let (InvalidLine(msg1), InvalidLine(msg2)) = (self, other) {
return msg1 == msg2;
} else if let (UnexpectedEof, UnexpectedEof) = (self, other) {
return true;
}
false
}
}
impl Error {
pub fn is_http_stream_error(&self) -> bool {
if let Error::HttpStream(_) = self {
return true;
}
false
}
pub fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::HttpStream(err) => Some(err.as_ref()),
_ => None,
}
}
}
pub type Result<T> = std::result::Result<T, Error>;