From 8c16239a0e6660259e43ca0c13c182f9e6f14920 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Wed, 7 Aug 2024 23:27:23 +0100 Subject: [PATCH] use reqwest client rather than global --- crates/librqbit/src/session.rs | 26 ++++++++++++++++++++--- crates/librqbit/src/tests/e2e.rs | 1 + crates/rqbit/src/main.rs | 1 + crates/tracker_comms/src/tracker_comms.rs | 5 ++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index 0f8ccae..e61eda0 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -196,12 +196,19 @@ pub struct Session { default_storage_factory: Option, + reqwest_client: reqwest::Client, + // This is stored for all tasks to stop when session is dropped. _cancellation_token_drop_guard: DropGuard, } -async fn torrent_from_url(url: &str) -> anyhow::Result { - let response = reqwest::get(url) +async fn torrent_from_url( + reqwest_client: &reqwest::Client, + url: &str, +) -> anyhow::Result { + let response = reqwest_client + .get(url) + .send() .await .context("error downloading torrent metadata")?; if !response.status().is_success() { @@ -406,6 +413,11 @@ impl<'a> AddTorrent<'a> { } } +pub struct SocksProxyConfig { + // must start with socks5 + pub url: String, +} + #[derive(Default)] pub struct SessionOptions { /// Turn on to disable DHT. @@ -436,6 +448,8 @@ pub struct SessionOptions { pub defer_writes_up_to: Option, pub default_storage_factory: Option, + + pub socks_proxy: Option, } async fn create_tcp_listener( @@ -534,6 +548,10 @@ impl Session { }) .unwrap_or_default(); + let reqwest_client = reqwest::Client::builder() + .build() + .context("error building HTTP(S) client")?; + let session = Arc::new(Self { persistence_filename, peer_id, @@ -547,6 +565,7 @@ impl Session { tcp_listen_port, disk_write_tx, default_storage_factory: opts.default_storage_factory, + reqwest_client, }); if let Some(mut disk_write_rx) = disk_write_rx { @@ -922,7 +941,7 @@ impl Session { AddTorrent::Url(url) if url.starts_with("http://") || url.starts_with("https://") => { - torrent_from_url(&url).await? + torrent_from_url(&self.reqwest_client, &url).await? } AddTorrent::Url(url) => { bail!( @@ -1210,6 +1229,7 @@ impl Session { Box::new(peer_rx_stats), force_tracker_interval, announce_port, + self.reqwest_client.clone(), ); Ok(merge_two_optional_streams(dht_rx, peer_rx)) diff --git a/crates/librqbit/src/tests/e2e.rs b/crates/librqbit/src/tests/e2e.rs index cb28906..c5bb611 100644 --- a/crates/librqbit/src/tests/e2e.rs +++ b/crates/librqbit/src/tests/e2e.rs @@ -74,6 +74,7 @@ async fn test_e2e() { enable_upnp_port_forwarding: false, default_storage_factory: None, defer_writes_up_to: None, + ..Default::default() }, ) .await diff --git a/crates/rqbit/src/main.rs b/crates/rqbit/src/main.rs index c6b8f1b..4046676 100644 --- a/crates/rqbit/src/main.rs +++ b/crates/rqbit/src/main.rs @@ -320,6 +320,7 @@ async fn async_main(opts: Opts) -> anyhow::Result<()> { wrap(FilesystemStorageFactory::default()).boxed() } }), + socks_proxy: None, }; let stats_printer = |session: Arc| async move { diff --git a/crates/tracker_comms/src/tracker_comms.rs b/crates/tracker_comms/src/tracker_comms.rs index 13f6283..c155b28 100644 --- a/crates/tracker_comms/src/tracker_comms.rs +++ b/crates/tracker_comms/src/tracker_comms.rs @@ -26,6 +26,7 @@ pub struct TrackerComms { force_tracker_interval: Option, tx: Sender, tcp_listen_port: Option, + reqwest_client: reqwest::Client, } #[derive(Default)] @@ -94,6 +95,7 @@ impl TrackerComms { stats: Box, force_interval: Option, tcp_listen_port: Option, + reqwest_client: reqwest::Client, ) -> Option> { let trackers = trackers .into_iter() @@ -130,6 +132,7 @@ impl TrackerComms { force_tracker_interval: force_interval, tx, tcp_listen_port, + reqwest_client }); let mut futures = FuturesUnordered::new(); for tracker in trackers { @@ -230,7 +233,7 @@ impl TrackerComms { async fn tracker_one_request_http(&self, tracker_url: Url) -> anyhow::Result { debug!(url = ?tracker_url, "calling tracker over http"); - let response: reqwest::Response = reqwest::get(tracker_url).await?; + let response: reqwest::Response = self.reqwest_client.get(tracker_url).send().await?; if !response.status().is_success() { anyhow::bail!("tracker responded with {:?}", response.status()); }