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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal