reqwest_env_proxy/
lib.rs

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}