1use std::net::IpAddr;
2
3#[derive(Debug, thiserror::Error)]
4pub enum FetchError {
5 #[error("private IP blocked: host {host} resolved to {resolved_ip}")]
6 PrivateIpBlocked { host: String, resolved_ip: IpAddr },
7
8 #[error("domain not in allowlist: {0}")]
9 DomainNotAllowed(String),
10
11 #[error("domain is blocked: {0}")]
12 DomainBlocked(String),
13
14 #[error("scheme not allowed: {0}")]
15 SchemeNotAllowed(String),
16
17 #[error("method not allowed: {0}")]
18 MethodNotAllowed(String),
19
20 #[error("DNS resolution failed: {0}")]
21 DnsResolutionFailed(String),
22
23 #[error("request body too large: {size} bytes exceeds limit of {limit} bytes")]
24 RequestBodyTooLarge { size: usize, limit: usize },
25
26 #[error("response body too large: {size} bytes exceeds limit of {limit} bytes")]
27 ResponseBodyTooLarge { size: usize, limit: usize },
28
29 #[error("too many redirects (limit: {limit})")]
30 TooManyRedirects { limit: u8 },
31
32 #[error("rate limit exceeded")]
33 RateLimitExceeded,
34
35 #[error("connection timeout")]
36 ConnectionTimeout,
37
38 #[error("request timeout")]
39 RequestTimeout,
40
41 #[error("invalid URL: {0}")]
42 InvalidUrl(String),
43
44 #[error("HTTP error: {0}")]
45 HttpError(String),
46
47 #[error("redirect to private IP: {url} resolved to {resolved_ip}")]
48 RedirectToPrivateIp { url: String, resolved_ip: IpAddr },
49}