Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ pub(crate) mod parts;
pub use http::*;

use async_trait::async_trait;
use reqwest::dns::Resolve;
use reqwest::header::{HeaderMap, HeaderValue};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
Expand Down Expand Up @@ -318,6 +319,14 @@ impl Certificate {
}
}

#[derive(Clone)]
struct DynResolver(Arc<dyn Resolve>);

impl std::fmt::Debug for DynResolver {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("DynResolver")
}
}
/// HTTP client configuration for remote object stores
#[derive(Debug, Clone)]
pub struct ClientOptions {
Expand All @@ -344,6 +353,7 @@ pub struct ClientOptions {
http1_only: ConfigValue<bool>,
http2_only: ConfigValue<bool>,
randomize_addresses: ConfigValue<bool>,
dns_resolver: Option<DynResolver>,
}

impl Default for ClientOptions {
Expand Down Expand Up @@ -382,6 +392,7 @@ impl Default for ClientOptions {
http1_only: true.into(),
http2_only: Default::default(),
randomize_addresses: true.into(),
dns_resolver: Default::default(),
}
}
}
Expand Down Expand Up @@ -755,6 +766,15 @@ impl ClientOptions {
self
}

/// Override the default DNS resolver with a custom [`reqwest::dns::Resolve`] implementation.
///
/// When set, [`ClientConfigKey::RandomizeAddresses`] will be ignored. The provided
/// resolver is responsible for resolving, shuffling, caching, etc.
pub fn with_dns_resolver(mut self, resolver: Arc<dyn Resolve>) -> Self {
self.dns_resolver = Some(DynResolver(resolver));
self
}

/// Get the default headers defined through `ClientOptions::with_default_headers`
pub fn get_default_headers(&self) -> Option<&HeaderMap> {
self.default_headers.as_ref()
Expand Down Expand Up @@ -880,7 +900,9 @@ impl ClientOptions {
// size of objects.
builder = builder.no_gzip().no_brotli().no_zstd().no_deflate();

if self.randomize_addresses.get()? {
if let Some(resolver) = &self.dns_resolver {
builder = builder.dns_resolver2(resolver.0.clone());
} else if self.randomize_addresses.get()? {
builder = builder.dns_resolver(Arc::new(dns::ShuffleResolver));
}

Expand Down
Loading