1use std::{fmt, io};
2
3use derive_more::{Display, From};
4
5use actix_http::error::{HttpError, ParseError};
6
7use crate::BoxError;
11
12#[derive(Debug, Display, From)]
14#[non_exhaustive]
15pub enum ConnectError {
16 #[display(fmt = "SSL is not supported")]
18 SslIsNotSupported,
19
20 #[display(fmt = "Failed resolving hostname: {}", _0)]
27 Resolver(Box<dyn std::error::Error>),
28
29 #[display(fmt = "No DNS records found for the input")]
31 NoRecords,
32
33 #[display(fmt = "{}", _0)]
35 H2(h2::Error),
36
37 #[display(fmt = "Timeout while establishing connection")]
39 Timeout,
40
41 #[display(fmt = "Internal error: connector has been disconnected")]
43 Disconnected,
44
45 #[display(fmt = "Connector received `Connect` method with unresolved host")]
47 Unresolved,
48
49 #[display(fmt = "{}", _0)]
51 Io(io::Error),
52}
53
54impl std::error::Error for ConnectError {}
55
56impl From<actix_tls::connect::ConnectError> for ConnectError {
57 fn from(err: actix_tls::connect::ConnectError) -> ConnectError {
58 match err {
59 actix_tls::connect::ConnectError::Resolver(e) => ConnectError::Resolver(e),
60 actix_tls::connect::ConnectError::NoRecords => ConnectError::NoRecords,
61 actix_tls::connect::ConnectError::InvalidInput => panic!(),
62 actix_tls::connect::ConnectError::Unresolved => ConnectError::Unresolved,
63 actix_tls::connect::ConnectError::Io(e) => ConnectError::Io(e),
64 }
65 }
66}
67
68#[derive(Debug, Display, From)]
69#[non_exhaustive]
70pub enum InvalidUrl {
71 #[display(fmt = "Missing URL scheme")]
72 MissingScheme,
73
74 #[display(fmt = "Unknown URL scheme")]
75 UnknownScheme,
76
77 #[display(fmt = "Missing host name")]
78 MissingHost,
79
80 #[display(fmt = "URL parse error: {}", _0)]
81 HttpError(http::Error),
82}
83
84impl std::error::Error for InvalidUrl {}
85
86#[derive(Debug, Display, From)]
88#[non_exhaustive]
89pub enum SendRequestError {
90 #[display(fmt = "Invalid URL: {}", _0)]
92 Url(InvalidUrl),
93
94 #[display(fmt = "Failed to connect to host: {}", _0)]
96 Connect(ConnectError),
97
98 Send(io::Error),
100
101 Response(ParseError),
103
104 #[display(fmt = "{}", _0)]
106 Http(HttpError),
107
108 #[display(fmt = "{}", _0)]
110 H2(h2::Error),
111
112 #[display(fmt = "Timeout while waiting for response")]
114 Timeout,
115
116 #[display(fmt = "Tunnels are not supported for http2 connection")]
118 TunnelNotSupported,
119
120 Body(BoxError),
122
123 #[display(fmt = "{:?}: {}", _1, _0)]
125 Custom(BoxError, Box<dyn fmt::Debug>),
126}
127
128impl std::error::Error for SendRequestError {}
129
130#[derive(Debug, Display, From)]
132#[non_exhaustive]
133pub enum FreezeRequestError {
134 #[display(fmt = "Invalid URL: {}", _0)]
136 Url(InvalidUrl),
137
138 #[display(fmt = "{}", _0)]
140 Http(HttpError),
141
142 #[display(fmt = "{:?}: {}", _1, _0)]
144 Custom(BoxError, Box<dyn fmt::Debug>),
145}
146
147impl std::error::Error for FreezeRequestError {}
148
149impl From<FreezeRequestError> for SendRequestError {
150 fn from(err: FreezeRequestError) -> Self {
151 match err {
152 FreezeRequestError::Url(err) => err.into(),
153 FreezeRequestError::Http(err) => err.into(),
154 FreezeRequestError::Custom(err, msg) => SendRequestError::Custom(err, msg),
155 }
156 }
157}