[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