[pbs-devel] [POC proxmox 1/4] http: client: make https connector generic over resolver
Christian Ebner
c.ebner at proxmox.com
Sat Sep 28 11:42:53 CEST 2024
Allow to instantiate a `HttpsConnector` not using the default
`getaddrinfo` based `GaiResolver` for domain name resolution, but
rather a custom resolver implementing the required traits.
The usecase for this is to swap out the DNS resolver for the
statically linked proxmox-backup-client binary, where the glibc
dependency is problematic because of possible ABI incompatibility.
Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
proxmox-http/Cargo.toml | 1 +
proxmox-http/debian/control | 8 +++++---
proxmox-http/src/client/connector.rs | 17 ++++++++++++-----
proxmox-http/src/client/simple.rs | 3 ++-
4 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/proxmox-http/Cargo.toml b/proxmox-http/Cargo.toml
index a15c3367..4a78880c 100644
--- a/proxmox-http/Cargo.toml
+++ b/proxmox-http/Cargo.toml
@@ -21,6 +21,7 @@ openssl = { version = "0.10", optional = true }
serde_json = { workspace = true, optional = true }
tokio = { workspace = true, features = [], optional = true }
tokio-openssl = { workspace = true, optional = true }
+tower-service.workspace = true
ureq = { version = "2.4", features = ["native-certs"], optional = true }
url = { workspace = true, optional = true }
diff --git a/proxmox-http/debian/control b/proxmox-http/debian/control
index 2d4d74b7..f5402ae6 100644
--- a/proxmox-http/debian/control
+++ b/proxmox-http/debian/control
@@ -6,7 +6,8 @@ Build-Depends: debhelper (>= 12),
cargo:native <!nocheck>,
rustc:native <!nocheck>,
libstd-rust-dev <!nocheck>,
- librust-anyhow-1+default-dev <!nocheck>
+ librust-anyhow-1+default-dev <!nocheck>,
+ librust-tower-service-0.3+default-dev <!nocheck>
Maintainer: Proxmox Support Team <support at proxmox.com>
Standards-Version: 4.6.2
Vcs-Git: git://git.proxmox.com/git/proxmox.git
@@ -19,7 +20,8 @@ Architecture: any
Multi-Arch: same
Depends:
${misc:Depends},
- librust-anyhow-1+default-dev
+ librust-anyhow-1+default-dev,
+ librust-tower-service-0.3+default-dev
Suggests:
librust-proxmox-http+client-dev (= ${binary:Version}),
librust-proxmox-http+client-sync-dev (= ${binary:Version}),
@@ -56,7 +58,7 @@ Depends:
librust-hyper-0.14+stream-dev (>= 0.14.5-~~),
librust-hyper-0.14+tcp-dev (>= 0.14.5-~~),
librust-openssl-0.10+default-dev,
- librust-proxmox-compression-0.2+default-dev (>= 0.2.3-~~),
+ librust-proxmox-compression-0.2+default-dev (>= 0.2.4-~~),
librust-tokio-1+default-dev (>= 1.6-~~),
librust-tokio-1+io-util-dev (>= 1.6-~~),
librust-tokio-openssl-0.6+default-dev (>= 0.6.1-~~)
diff --git a/proxmox-http/src/client/connector.rs b/proxmox-http/src/client/connector.rs
index 63b9d10c..c0435c60 100644
--- a/proxmox-http/src/client/connector.rs
+++ b/proxmox-http/src/client/connector.rs
@@ -6,6 +6,7 @@ use std::task::{Context, Poll};
use futures::*;
use http::Uri;
+use hyper::client::connect::dns::Name;
use hyper::client::HttpConnector;
use openssl::ssl::SslConnector;
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
@@ -23,8 +24,8 @@ use crate::{RateLimitedStream, ShareableRateLimit};
type SharedRateLimit = Arc<dyn ShareableRateLimit>;
#[derive(Clone)]
-pub struct HttpsConnector {
- connector: HttpConnector,
+pub struct HttpsConnector<T> {
+ connector: HttpConnector<T>,
ssl_connector: Arc<SslConnector>,
proxy: Option<ProxyConfig>,
tcp_keepalive: u32,
@@ -32,9 +33,9 @@ pub struct HttpsConnector {
write_limiter: Option<SharedRateLimit>,
}
-impl HttpsConnector {
+impl<T> HttpsConnector<T> {
pub fn with_connector(
- mut connector: HttpConnector,
+ mut connector: HttpConnector<T>,
ssl_connector: SslConnector,
tcp_keepalive: u32,
) -> Self {
@@ -122,7 +123,13 @@ impl HttpsConnector {
}
}
-impl hyper::service::Service<Uri> for HttpsConnector {
+impl<T> hyper::service::Service<Uri> for HttpsConnector<T>
+where
+ T: tower_service::Service<Name> + Clone + Send + Sync + 'static,
+ T::Future: Send,
+ T::Error: Into<Box<(dyn std::error::Error + Send + Sync + 'static)>>,
+ T::Response: std::iter::Iterator<Item = std::net::SocketAddr>,
+{
type Response = MaybeTlsStream<RateLimitedStream<TcpStream>>;
type Error = Error;
#[allow(clippy::type_complexity)]
diff --git a/proxmox-http/src/client/simple.rs b/proxmox-http/src/client/simple.rs
index 062889ac..cb8bb777 100644
--- a/proxmox-http/src/client/simple.rs
+++ b/proxmox-http/src/client/simple.rs
@@ -8,6 +8,7 @@ use futures::*;
#[cfg(all(feature = "client-trait", feature = "proxmox-async"))]
use http::header::HeaderName;
use http::{HeaderValue, Request, Response};
+use hyper::client::connect::dns::GaiResolver;
use hyper::client::Client as HyperClient;
use hyper::client::HttpConnector;
use hyper::Body;
@@ -18,7 +19,7 @@ use crate::HttpOptions;
/// Asynchronous HTTP client implementation
pub struct Client {
- client: HyperClient<HttpsConnector, Body>,
+ client: HyperClient<HttpsConnector<GaiResolver>, Body>,
options: HttpOptions,
}
--
2.39.5
More information about the pbs-devel
mailing list