async_web_client/http/
error.rs

1use std::{io, sync::Arc};
2
3use http::{uri::Scheme, HeaderValue, Method};
4use thiserror::Error;
5
6use crate::TransportError;
7
8#[derive(Error, Debug, Clone)]
9pub enum HttpError {
10    #[error("invalid header value: {0:?}")]
11    InvalidHeaderValue(HeaderValue),
12    #[error("invalid method: {0}")]
13    InvalidMethod(Method),
14    #[error("redirect")]
15    Redirect,
16    #[cfg(not(target_arch = "wasm32"))]
17    #[error("missing host in URI or host header")]
18    MissingHost,
19    #[cfg(not(target_arch = "wasm32"))]
20    #[error("unexpected URI scheme: {0:?}")]
21    UnexpectedScheme(Scheme),
22    #[cfg(not(target_arch = "wasm32"))]
23    #[error("unsupported transfer encoding: {0:?}")]
24    UnsupportedTransferEncoding(HeaderValue),
25    #[cfg(not(target_arch = "wasm32"))]
26    #[error("connect error: {0:?}")]
27    ConnectError(TransportError),
28    #[cfg(not(target_arch = "wasm32"))]
29    #[error("io error: {0:?}")]
30    IoError(Arc<io::Error>),
31}
32
33impl From<HttpError> for io::Error {
34    fn from(value: HttpError) -> Self {
35        let kind = match &value {
36            HttpError::InvalidHeaderValue(_) => io::ErrorKind::InvalidData,
37            HttpError::InvalidMethod(_) => io::ErrorKind::InvalidData,
38            HttpError::Redirect => io::ErrorKind::Unsupported,
39            HttpError::MissingHost => io::ErrorKind::Unsupported,
40            HttpError::UnexpectedScheme(_) => io::ErrorKind::Unsupported,
41            HttpError::ConnectError(err) => match err {
42                TransportError::InvalidDnsName(_) => io::ErrorKind::InvalidData,
43                TransportError::TcpConnect(err) => err.kind(),
44                TransportError::TlsConnect(err) => err.kind(),
45            },
46            HttpError::IoError(err) => err.kind(),
47            HttpError::UnsupportedTransferEncoding(_) => io::ErrorKind::Unsupported,
48        };
49        io::Error::new(kind, value)
50    }
51}