feat: allow passing in a custom reqwest Client (#1745)

## Summary

I am looking to instantiate a `RegistryClient`. However, when using the
`RegistryClientBuilder` a new reqwest client is always constructed. I
would like to pass in a custom `reqwest::Client` to be able to share the
http resources with other parts of my application.

## Test Plan

The uv codebase does not use my addition to the builder and all tests
still succeed. And in my code I can pass a custom Client.
This commit is contained in:
Bas Zalmstra 2024-02-20 15:50:18 +01:00 committed by GitHub
parent dd7d533411
commit daf2800ddf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -40,6 +40,7 @@ pub struct RegistryClientBuilder {
retries: u32, retries: u32,
connectivity: Connectivity, connectivity: Connectivity,
cache: Cache, cache: Cache,
client: Option<Client>,
} }
impl RegistryClientBuilder { impl RegistryClientBuilder {
@ -49,6 +50,7 @@ impl RegistryClientBuilder {
cache, cache,
connectivity: Connectivity::Online, connectivity: Connectivity::Online,
retries: 3, retries: 3,
client: None,
} }
} }
} }
@ -78,19 +80,25 @@ impl RegistryClientBuilder {
self self
} }
#[must_use]
pub fn client(mut self, client: Client) -> Self {
self.client = Some(client);
self
}
pub fn build(self) -> RegistryClient { pub fn build(self) -> RegistryClient {
let client_raw = { let client_raw = self.client.unwrap_or_else(|| {
// Get pip timeout from env var // Get pip timeout from env var
let default_timeout = 5 * 60; let default_timeout = 5 * 60;
let timeout = env::var("UV_REQUEST_TIMEOUT") let timeout = env::var("UV_REQUEST_TIMEOUT")
.map_err(|_| default_timeout) .map_err(|_| default_timeout)
.and_then(|value| { .and_then(|value| {
value.parse::<u64>() value.parse::<u64>()
.map_err(|_| { .map_err(|_| {
warn_user_once!("Ignoring invalid value for UV_REQUEST_TIMEOUT. Expected integer number of seconds, got {value}."); warn_user_once!("Ignoring invalid value for UV_REQUEST_TIMEOUT. Expected integer number of seconds, got {value}.");
default_timeout default_timeout
}) })
}).unwrap_or(default_timeout); }).unwrap_or(default_timeout);
debug!("Using registry request timeout of {}s", timeout); debug!("Using registry request timeout of {}s", timeout);
// Disallow any connections. // Disallow any connections.
let client_core = ClientBuilder::new() let client_core = ClientBuilder::new()
@ -99,7 +107,7 @@ impl RegistryClientBuilder {
.timeout(std::time::Duration::from_secs(timeout)); .timeout(std::time::Duration::from_secs(timeout));
client_core.build().expect("Failed to build HTTP client.") client_core.build().expect("Failed to build HTTP client.")
}; });
let uncached_client = match self.connectivity { let uncached_client = match self.connectivity {
Connectivity::Online => { Connectivity::Online => {