From: Christian Ebner <c.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH v4 proxmox 1/5] http: client: make https connector generic over resolver
Date: Tue, 8 Apr 2025 17:04:14 +0200 [thread overview]
Message-ID: <20250408150418.292311-2-c.ebner@proxmox.com> (raw)
In-Reply-To: <20250408150418.292311-1-c.ebner@proxmox.com>
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.
However, set the generic type on `HttpsConnector` to default to
`GaiResolver` to limit inconvenience for implementations using it.
Adds tower-service as cargo workspace dependency and build dependency
to debian/control.
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 3:
- add GaiResolver as default type for generic on HttpsConnector
proxmox-http/Cargo.toml | 1 +
proxmox-http/src/client/connector.rs | 17 ++++++++++++-----
proxmox-http/src/client/simple.rs | 3 ++-
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/proxmox-http/Cargo.toml b/proxmox-http/Cargo.toml
index c8c963f7..6bfb1413 100644
--- a/proxmox-http/Cargo.toml
+++ b/proxmox-http/Cargo.toml
@@ -22,6 +22,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", "native-tls"], optional = true, default-features = false }
url = { workspace = true, optional = true }
diff --git a/proxmox-http/src/client/connector.rs b/proxmox-http/src/client/connector.rs
index 63b9d10c..2e04680f 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::{GaiResolver, 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 = GaiResolver> {
+ 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
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
next prev parent reply other threads:[~2025-04-08 15:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-08 15:04 [pbs-devel] [PATCH v4 proxmox proxmox-backup 0/5] fix 4788: statically linked proxmox-backup-client Christian Ebner
2025-04-08 15:04 ` Christian Ebner [this message]
2025-04-08 15:04 ` [pbs-devel] [PATCH v4 proxmox-backup 2/5] fix: 4788: Makefile: target for statically linked client binary Christian Ebner
2025-04-08 15:04 ` [pbs-devel] [PATCH v4 proxmox-backup 3/5] Makefile: switch path based on build mode and target Christian Ebner
2025-04-08 15:04 ` [pbs-devel] [PATCH v4 proxmox-backup 4/5] client: http: Use custom resolver for statically linked binary Christian Ebner
2025-04-08 15:04 ` [pbs-devel] [PATCH v4 proxmox-backup 5/5] docs: mention different name resolution " Christian Ebner
2025-04-09 11:12 ` [pbs-devel] superseded: [PATCH v4 proxmox proxmox-backup 0/5] fix 4788: statically linked proxmox-backup-client Christian Ebner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250408150418.292311-2-c.ebner@proxmox.com \
--to=c.ebner@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal