From 8a2ae401df8a34b9a2ae823aedee8857d5737b48 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 16 Jul 2024 22:29:42 +0000 Subject: [PATCH] convert Client into Service Signed-off-by: Jason Volk --- src/admin/federation/commands.rs | 1 - src/api/client/media.rs | 2 +- src/service/client/mod.rs | 143 ++++++++++++++++++++++++++++++ src/service/globals/mod.rs | 8 +- src/service/mod.rs | 3 +- src/service/pusher/mod.rs | 7 +- src/service/sending/appservice.rs | 1 - src/service/sending/mod.rs | 2 +- src/service/sending/resolve.rs | 1 - src/service/sending/sender.rs | 3 +- src/service/service.rs | 6 ++ src/service/services.rs | 4 +- src/service/updates/mod.rs | 1 - 13 files changed, 159 insertions(+), 23 deletions(-) create mode 100644 src/service/client/mod.rs diff --git a/src/admin/federation/commands.rs b/src/admin/federation/commands.rs index a97e7582..331231ae 100644 --- a/src/admin/federation/commands.rs +++ b/src/admin/federation/commands.rs @@ -35,7 +35,6 @@ pub(super) async fn fetch_support_well_known( _body: Vec<&str>, server_name: Box, ) -> Result { let response = services() - .globals .client .default .get(format!("https://{server_name}/.well-known/matrix/support")) diff --git a/src/api/client/media.rs b/src/api/client/media.rs index 1adcefdd..46f8152b 100644 --- a/src/api/client/media.rs +++ b/src/api/client/media.rs @@ -621,7 +621,7 @@ async fn request_url_preview(services: &Services, url: &str) -> Result) -> Result> { + let config = &args.server.config; + let resolver = args + .get_service::("resolver") + .expect("resolver must be built prior to client"); + + Ok(Arc::new(Self { + default: base(config) + .unwrap() + .dns_resolver(resolver.clone()) + .build() + .unwrap(), + + url_preview: base(config) + .unwrap() + .dns_resolver(resolver.clone()) + .redirect(redirect::Policy::limited(3)) + .build() + .unwrap(), + + well_known: base(config) + .unwrap() + .dns_resolver(resolver.hooked.clone()) + .connect_timeout(Duration::from_secs(config.well_known_conn_timeout)) + .read_timeout(Duration::from_secs(config.well_known_timeout)) + .timeout(Duration::from_secs(config.well_known_timeout)) + .pool_max_idle_per_host(0) + .redirect(redirect::Policy::limited(4)) + .build() + .unwrap(), + + federation: base(config) + .unwrap() + .dns_resolver(resolver.hooked.clone()) + .read_timeout(Duration::from_secs(config.federation_timeout)) + .timeout(Duration::from_secs(config.federation_timeout)) + .pool_max_idle_per_host(config.federation_idle_per_host.into()) + .pool_idle_timeout(Duration::from_secs(config.federation_idle_timeout)) + .redirect(redirect::Policy::limited(3)) + .build() + .unwrap(), + + sender: base(config) + .unwrap() + .dns_resolver(resolver.hooked.clone()) + .read_timeout(Duration::from_secs(config.sender_timeout)) + .timeout(Duration::from_secs(config.sender_timeout)) + .pool_max_idle_per_host(1) + .pool_idle_timeout(Duration::from_secs(config.sender_idle_timeout)) + .redirect(redirect::Policy::limited(2)) + .build() + .unwrap(), + + appservice: base(config) + .unwrap() + .dns_resolver(resolver.clone()) + .connect_timeout(Duration::from_secs(5)) + .read_timeout(Duration::from_secs(config.appservice_timeout)) + .timeout(Duration::from_secs(config.appservice_timeout)) + .pool_max_idle_per_host(1) + .pool_idle_timeout(Duration::from_secs(config.appservice_idle_timeout)) + .redirect(redirect::Policy::limited(2)) + .build() + .unwrap(), + + pusher: base(config) + .unwrap() + .dns_resolver(resolver.clone()) + .pool_max_idle_per_host(1) + .pool_idle_timeout(Duration::from_secs(config.pusher_idle_timeout)) + .redirect(redirect::Policy::limited(2)) + .build() + .unwrap(), + })) + } + + fn name(&self) -> &str { service::make_name(std::module_path!()) } +} + +fn base(config: &Config) -> Result { + let mut builder = reqwest::Client::builder() + .hickory_dns(true) + .connect_timeout(Duration::from_secs(config.request_conn_timeout)) + .read_timeout(Duration::from_secs(config.request_timeout)) + .timeout(Duration::from_secs(config.request_total_timeout)) + .pool_idle_timeout(Duration::from_secs(config.request_idle_timeout)) + .pool_max_idle_per_host(config.request_idle_per_host.into()) + .user_agent(conduit::version::user_agent()) + .redirect(redirect::Policy::limited(6)) + .connection_verbose(true); + + #[cfg(feature = "gzip_compression")] + { + builder = if config.gzip_compression { + builder.gzip(true) + } else { + builder.gzip(false).no_gzip() + }; + }; + + #[cfg(feature = "brotli_compression")] + { + builder = if config.brotli_compression { + builder.brotli(true) + } else { + builder.brotli(false).no_brotli() + }; + }; + + #[cfg(not(feature = "gzip_compression"))] + { + builder = builder.no_gzip(); + }; + + #[cfg(not(feature = "brotli_compression"))] + { + builder = builder.no_brotli(); + }; + + if let Some(proxy) = config.proxy.to_proxy()? { + Ok(builder.proxy(proxy)) + } else { + Ok(builder) + } +} diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs index a2fba4d9..811aff3a 100644 --- a/src/service/globals/mod.rs +++ b/src/service/globals/mod.rs @@ -1,4 +1,3 @@ -mod client; mod data; mod emerg_access; pub(super) mod migrations; @@ -24,7 +23,7 @@ use ruma::{ use tokio::sync::Mutex; use url::Url; -use crate::{resolver, service, services}; +use crate::{service, services}; pub struct Service { pub db: Data, @@ -33,7 +32,6 @@ pub struct Service { pub cidr_range_denylist: Vec, keypair: Arc, jwt_decoding_key: Option, - pub client: client::Client, pub stable_room_versions: Vec, pub unstable_room_versions: Vec, pub bad_event_ratelimiter: Arc>>, @@ -85,15 +83,11 @@ impl crate::Service for Service { cidr_range_denylist.push(cidr); } - let resolver = service::get::(args.service, "resolver") - .expect("resolver must be built prior to globals"); - let mut s = Self { db, config: config.clone(), cidr_range_denylist, keypair: Arc::new(keypair), - client: client::Client::new(config, &resolver), jwt_decoding_key, stable_room_versions, unstable_room_versions, diff --git a/src/service/mod.rs b/src/service/mod.rs index 870d865b..46adb072 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -7,6 +7,7 @@ pub mod services; pub mod account_data; pub mod admin; pub mod appservice; +pub mod client; pub mod globals; pub mod key_backups; pub mod media; @@ -25,7 +26,7 @@ extern crate conduit_database as database; use std::sync::{Arc, RwLock}; -pub(crate) use conduit::{config, debug_error, debug_warn, utils, Config, Error, Result, Server}; +pub(crate) use conduit::{config, debug_error, debug_warn, utils, Error, Result, Server}; pub use conduit::{pdu, PduBuilder, PduCount, PduEvent}; use database::Database; pub(crate) use service::{Args, Service}; diff --git a/src/service/pusher/mod.rs b/src/service/pusher/mod.rs index ea48ea7c..38ea5b9a 100644 --- a/src/service/pusher/mod.rs +++ b/src/service/pusher/mod.rs @@ -84,12 +84,7 @@ impl Service { } } - let response = services() - .globals - .client - .pusher - .execute(reqwest_request) - .await; + let response = services().client.pusher.execute(reqwest_request).await; match response { Ok(mut response) => { diff --git a/src/service/sending/appservice.rs b/src/service/sending/appservice.rs index 721424e1..9e060e81 100644 --- a/src/service/sending/appservice.rs +++ b/src/service/sending/appservice.rs @@ -49,7 +49,6 @@ where let reqwest_request = reqwest::Request::try_from(http_request)?; let mut response = services() - .globals .client .appservice .execute(reqwest_request) diff --git a/src/service/sending/mod.rs b/src/service/sending/mod.rs index fd9acd3d..be10184d 100644 --- a/src/service/sending/mod.rs +++ b/src/service/sending/mod.rs @@ -194,7 +194,7 @@ impl Service { where T: OutgoingRequest + Debug + Send, { - let client = &services().globals.client.federation; + let client = &services().client.federation; send::send(client, dest, request).await } diff --git a/src/service/sending/resolve.rs b/src/service/sending/resolve.rs index 4c1e4758..f8d1c51c 100644 --- a/src/service/sending/resolve.rs +++ b/src/service/sending/resolve.rs @@ -178,7 +178,6 @@ async fn request_well_known(dest: &str) -> Result> { } let response = services() - .globals .client .well_known .get(&format!("https://{dest}/.well-known/matrix/server")) diff --git a/src/service/sending/sender.rs b/src/service/sending/sender.rs index 2f542dfe..e6b68e9e 100644 --- a/src/service/sending/sender.rs +++ b/src/service/sending/sender.rs @@ -611,11 +611,10 @@ async fn send_events_dest_normal( } } - let client = &services().globals.client.sender; //debug_assert!(pdu_jsons.len() + edu_jsons.len() > 0, "sending empty // transaction"); send::send( - client, + &services().client.sender, server, send_transaction_message::v1::Request { origin: services().globals.server_name().to_owned(), diff --git a/src/service/service.rs b/src/service/service.rs index 8b49d455..99b8723a 100644 --- a/src/service/service.rs +++ b/src/service/service.rs @@ -43,6 +43,12 @@ pub(crate) struct Args<'a> { pub(crate) type Map = BTreeMap; pub(crate) type MapVal = (Arc, Arc); +impl Args<'_> { + pub(crate) fn get_service(&self, name: &str) -> Option> { + get::(self.service, name) + } +} + pub(crate) fn get(map: &Map, name: &str) -> Option> { map.get(name).map(|(_, s)| { s.clone() diff --git a/src/service/services.rs b/src/service/services.rs index fb13f24a..03f3a9ba 100644 --- a/src/service/services.rs +++ b/src/service/services.rs @@ -5,7 +5,7 @@ use database::Database; use tokio::sync::Mutex; use crate::{ - account_data, admin, appservice, globals, key_backups, + account_data, admin, appservice, client, globals, key_backups, manager::Manager, media, presence, pusher, resolver, rooms, sending, service, service::{Args, Map, Service}, @@ -14,6 +14,7 @@ use crate::{ pub struct Services { pub resolver: Arc, + pub client: Arc, pub globals: Arc, pub rooms: rooms::Service, pub appservice: Arc, @@ -52,6 +53,7 @@ impl Services { Ok(Self { resolver: build!(resolver::Service), + client: build!(client::Service), globals: build!(globals::Service), rooms: rooms::Service { alias: build!(rooms::alias::Service), diff --git a/src/service/updates/mod.rs b/src/service/updates/mod.rs index 3fb680d6..db69d9b0 100644 --- a/src/service/updates/mod.rs +++ b/src/service/updates/mod.rs @@ -64,7 +64,6 @@ impl Service { #[tracing::instrument(skip_all)] async fn handle_updates(&self) -> Result<()> { let response = services() - .globals .client .default .get(CHECK_FOR_UPDATES_URL)