From e5bfc2c4eac74e0ed857bc37cca51c1e7aa6d602 Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Tue, 28 May 2024 14:41:19 +0900 Subject: [PATCH] wip: refactor --- rpxy-certs/src/lib.rs | 47 ++++++++++++++++++++---------- rpxy-certs/src/reloader_service.rs | 2 +- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/rpxy-certs/src/lib.rs b/rpxy-certs/src/lib.rs index b8abda8..106dbdd 100644 --- a/rpxy-certs/src/lib.rs +++ b/rpxy-certs/src/lib.rs @@ -6,12 +6,18 @@ mod server_crypto; #[allow(unused_imports)] mod log { - pub(crate) use tracing::{debug, error, info, warn}; + pub(super) use tracing::{debug, error, info, warn}; } -/* ------------------------------------------------ */ -use crate::{error::*, reloader_service::CryptoReloader}; -use hot_reload::{ReloaderReceiver, ReloaderService}; +use crate::{ + error::*, + reloader_service::{CryptoReloader, DynCryptoSource}, +}; +use hot_reload::{ReloaderReceiver, ReloaderService}; +use rustc_hash::FxHashMap as HashMap; +use std::sync::Arc; + +/* ------------------------------------------------ */ pub use crate::{ certs::SingleServerCertsKeys, crypto_source::{CryptoFileSource, CryptoFileSourceBuilder, CryptoFileSourceBuilderError, CryptoSource}, @@ -19,26 +25,37 @@ pub use crate::{ }; /* ------------------------------------------------ */ -/// Constants TODO: define from outside -const CERTS_WATCH_DELAY_SECS: u32 = 60; +// Constants +/// Default delay in seconds to watch certificates +const DEFAULT_CERTS_WATCH_DELAY_SECS: u32 = 60; +/// Load certificates only when updated const LOAD_CERTS_ONLY_WHEN_UPDATED: bool = true; -/* ------------------------------------------------ */ /// Result type inner of certificate reloader service type ReloaderServiceResultInner = ( ReloaderService, ReloaderReceiver, ); -/// Build certificate reloader service -pub async fn build_cert_reloader() -> Result -// where -// T: CryptoSource + Clone + Send + Sync + 'static, +/// Build certificate reloader service, which accepts a map of server names to `CryptoSource` instances +pub async fn build_cert_reloader( + crypto_source_map: &HashMap, + certs_watch_period: Option, +) -> Result +where + T: CryptoSource + Send + Sync + Clone + 'static, { - // TODO: fix later - let source = rustc_hash::FxHashMap::default(); + let source = crypto_source_map + .iter() + .map(|(k, v)| { + let server_name_bytes = k.as_bytes().to_vec().to_ascii_lowercase(); + let dyn_crypto_source = Arc::new(Box::new(v.clone()) as Box); + (server_name_bytes, dyn_crypto_source) + }) + .collect::>(); + + let certs_watch_period = certs_watch_period.unwrap_or(DEFAULT_CERTS_WATCH_DELAY_SECS); let (cert_reloader_service, cert_reloader_rx) = - ReloaderService::::new(&source, CERTS_WATCH_DELAY_SECS, !LOAD_CERTS_ONLY_WHEN_UPDATED) - .await?; + ReloaderService::::new(&source, certs_watch_period, !LOAD_CERTS_ONLY_WHEN_UPDATED).await?; Ok((cert_reloader_service, cert_reloader_rx)) } diff --git a/rpxy-certs/src/reloader_service.rs b/rpxy-certs/src/reloader_service.rs index 8427f3a..c3d1fcd 100644 --- a/rpxy-certs/src/reloader_service.rs +++ b/rpxy-certs/src/reloader_service.rs @@ -12,7 +12,7 @@ use std::sync::Arc; /* ------------------------------------------------ */ /// Boxed CryptoSource trait object with Send and Sync /// TODO: support for not only `CryptoFileSource` but also other type of sources -type DynCryptoSource = dyn CryptoSource + Send + Sync + 'static; +pub(super) type DynCryptoSource = dyn CryptoSource + Send + Sync + 'static; #[derive(Clone)] /// Reloader service for certificates and keys for TLS