1use reqwest::Proxy;
2
3pub trait EnvProxyBuilder {
4 fn env_proxy(self, domain: &str) -> Self;
5}
6
7fn proxies_from_env(domain: &str) -> Option<(Proxy, Proxy)> {
8 let uri = if domain.ends_with(".i2p") {
9 std::env::var("i2p_proxy").ok()
10 } else {
11 None
12 };
13
14 let uri = uri.or_else(|| std::env::var("all_proxy").ok())?;
15
16 let http_proxy = Proxy::http(&uri).ok()?;
17 let https_proxy = Proxy::https(&uri).ok()?;
18 Some((http_proxy, https_proxy))
19}
20
21impl EnvProxyBuilder for reqwest::ClientBuilder {
22 fn env_proxy(self, domain: &str) -> Self {
23 match proxies_from_env(domain) {
24 Some((http_proxy, https_proxy)) => self.proxy(http_proxy).proxy(https_proxy),
25 None => self,
26 }
27 }
28}
29
30#[cfg(feature = "blocking")]
31impl EnvProxyBuilder for reqwest::blocking::ClientBuilder {
32 fn env_proxy(self, domain: &str) -> Self {
33 match proxies_from_env(domain) {
34 Some((http_proxy, https_proxy)) => self.proxy(http_proxy).proxy(https_proxy),
35 None => self,
36 }
37 }
38}