diff --git a/crates/uv-client/src/base_client.rs b/crates/uv-client/src/base_client.rs index 1421e95d10665..43a59139fa8c3 100644 --- a/crates/uv-client/src/base_client.rs +++ b/crates/uv-client/src/base_client.rs @@ -1,5 +1,5 @@ use itertools::Itertools; -use reqwest::{Client, ClientBuilder, Response}; +use reqwest::{Client, ClientBuilder, Proxy, Response}; use reqwest_middleware::{ClientWithMiddleware, Middleware}; use reqwest_retry::policies::ExponentialBackoff; use reqwest_retry::{ @@ -56,6 +56,7 @@ pub struct BaseClientBuilder<'a> { url_auth_policies: Option, default_timeout: Duration, extra_middleware: Option, + proxies: Vec, } /// A list of user-defined middlewares to be applied to the client. @@ -90,6 +91,7 @@ impl BaseClientBuilder<'_> { url_auth_policies: None, default_timeout: Duration::from_secs(30), extra_middleware: None, + proxies: vec![], } } } @@ -161,6 +163,12 @@ impl<'a> BaseClientBuilder<'a> { self } + #[must_use] + pub fn proxy(mut self, proxy: Proxy) -> Self { + self.proxies.push(proxy); + self + } + pub fn is_offline(&self) -> bool { matches!(self.connectivity, Connectivity::Offline) } @@ -301,6 +309,13 @@ impl<'a> BaseClientBuilder<'a> { client_builder }; + // apply proxies + let mut client_builder = client_builder; + for p in &self.proxies { + client_builder = client_builder.proxy(p.clone()); + } + let client_builder = client_builder; + client_builder .build() .expect("Failed to build HTTP client.") diff --git a/crates/uv-client/src/registry_client.rs b/crates/uv-client/src/registry_client.rs index 6f4c927f12523..ea476e1d7d95b 100644 --- a/crates/uv-client/src/registry_client.rs +++ b/crates/uv-client/src/registry_client.rs @@ -8,7 +8,7 @@ use async_http_range_reader::AsyncHttpRangeReader; use futures::{FutureExt, StreamExt, TryStreamExt}; use http::HeaderMap; use itertools::Either; -use reqwest::{Response, StatusCode}; +use reqwest::{Proxy, Response, StatusCode}; use reqwest_middleware::ClientWithMiddleware; use tokio::sync::Semaphore; use tracing::{info_span, instrument, trace, warn, Instrument}; @@ -133,6 +133,12 @@ impl<'a> RegistryClientBuilder<'a> { self } + #[must_use] + pub fn proxy(mut self, proxy: Proxy) -> Self { + self.base_client_builder = self.base_client_builder.proxy(proxy); + self + } + pub fn build(self) -> RegistryClient { // Build a base client let builder = self.base_client_builder;