async_web_client/http/
error.rs1use 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}