From daf2800ddfb033e0cbc90fa4419d49ff05eaba8e Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Tue, 20 Feb 2024 15:50:18 +0100 Subject: [PATCH] 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. --- crates/uv-client/src/registry_client.rs | 28 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/crates/uv-client/src/registry_client.rs b/crates/uv-client/src/registry_client.rs index acfea86c3..c83569f75 100644 --- a/crates/uv-client/src/registry_client.rs +++ b/crates/uv-client/src/registry_client.rs @@ -40,6 +40,7 @@ pub struct RegistryClientBuilder { retries: u32, connectivity: Connectivity, cache: Cache, + client: Option, } impl RegistryClientBuilder { @@ -49,6 +50,7 @@ impl RegistryClientBuilder { cache, connectivity: Connectivity::Online, retries: 3, + client: None, } } } @@ -78,19 +80,25 @@ impl RegistryClientBuilder { self } + #[must_use] + pub fn client(mut self, client: Client) -> Self { + self.client = Some(client); + self + } + pub fn build(self) -> RegistryClient { - let client_raw = { + let client_raw = self.client.unwrap_or_else(|| { // Get pip timeout from env var let default_timeout = 5 * 60; let timeout = env::var("UV_REQUEST_TIMEOUT") - .map_err(|_| default_timeout) - .and_then(|value| { - value.parse::() - .map_err(|_| { - warn_user_once!("Ignoring invalid value for UV_REQUEST_TIMEOUT. Expected integer number of seconds, got {value}."); - default_timeout - }) - }).unwrap_or(default_timeout); + .map_err(|_| default_timeout) + .and_then(|value| { + value.parse::() + .map_err(|_| { + warn_user_once!("Ignoring invalid value for UV_REQUEST_TIMEOUT. Expected integer number of seconds, got {value}."); + default_timeout + }) + }).unwrap_or(default_timeout); debug!("Using registry request timeout of {}s", timeout); // Disallow any connections. let client_core = ClientBuilder::new() @@ -99,7 +107,7 @@ impl RegistryClientBuilder { .timeout(std::time::Duration::from_secs(timeout)); client_core.build().expect("Failed to build HTTP client.") - }; + }); let uncached_client = match self.connectivity { Connectivity::Online => {