[pbs-devel] [PATCH proxmox-backup 2/2] http: add helper to parse proxy configuration

Dietmar Maurer dietmar at proxmox.com
Wed Apr 28 10:26:30 CEST 2021


---
 src/tools/http.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/src/tools/http.rs b/src/tools/http.rs
index e36e6c51..f4ccefc9 100644
--- a/src/tools/http.rs
+++ b/src/tools/http.rs
@@ -37,6 +37,68 @@ pub struct ProxyConfig {
     pub force_connect: bool,
 }
 
+impl ProxyConfig {
+
+    /// Parse proxy config from ALL_PROXY environment var
+    pub fn from_proxy_env() -> Result<Option<ProxyConfig>, Error> {
+
+        // We only support/use ALL_PROXY environment
+
+        match std::env::var_os("ALL_PROXY") {
+            None => return Ok(None),
+            Some(all_proxy) => {
+                let all_proxy = match all_proxy.to_str() {
+                    Some(s) => String::from(s),
+                    None => bail!("non UTF-8 content in env ALL_PROXY"),
+                };
+                if all_proxy.is_empty() {
+                    return Ok(None);
+                }
+                let config = Self::parse_proxy_url(&all_proxy)?;
+                Ok(Some(config))
+            }
+        }
+    }
+
+    /// Parse proxy configuration string [http://]<host>[:port]
+    ///
+    /// Default port is 1080 (like curl)
+    pub fn parse_proxy_url(http_proxy: &str) -> Result<ProxyConfig, Error> {
+        proxmox::try_block!({
+            let proxy_uri: Uri = http_proxy.parse()?;
+            let proxy_authority = match proxy_uri.authority() {
+                Some(authority) => authority,
+                None => bail!("missing proxy authority"),
+            };
+            let host = proxy_authority.host().to_owned();
+            let port = match proxy_uri.port() {
+                Some(port) => port.as_u16(),
+                None => 1080, // CURL default port
+            };
+
+            match proxy_uri.scheme_str() {
+                Some("http") => { /* Ok */ }
+                Some(scheme) => bail!("unsupported proxy scheme '{}'", scheme),
+                None => { /* assume HTTP */ }
+            }
+
+            let authority_vec: Vec<&str> = proxy_authority.as_str().rsplitn(2, '@').collect();
+            let authorization = if authority_vec.len() == 2 {
+                Some(format!("Basic {}", base64::encode(authority_vec[1])))
+            } else {
+                None
+            };
+
+            Ok(ProxyConfig {
+                host,
+                port,
+                authorization,
+                force_connect: false,
+            })
+        }).map_err(|err| format_err!("parse_proxy_url failed: {}", err))
+    }
+}
+
 /// Asyncrounous HTTP client implementation
 pub struct SimpleHttp {
     client: Client<HttpsConnector, Body>,
-- 
2.20.1





More information about the pbs-devel mailing list