diff --git a/src/config.rs b/src/config.rs index 68255c3..038dc4f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -356,9 +356,10 @@ clone_trait_object!(UrlVerifier); /// prevent denial of service attacks, where an attacker triggers fetching of recursive objects. /// /// +#[derive(Clone)] pub struct Data { pub(crate) config: FederationConfig, - pub(crate) request_counter: AtomicU32, + pub(crate) request_counter: RequestCounter, } impl Data { @@ -381,7 +382,7 @@ impl Data { } /// Total number of outgoing HTTP requests made with this data. pub fn request_count(&self) -> u32 { - self.request_counter.load(Ordering::Relaxed) + self.request_counter.0.load(Ordering::Relaxed) } /// Add HTTP signature to arbitrary request @@ -412,6 +413,16 @@ impl Deref for Data { } } +/// Wrapper to implement `Clone` +#[derive(Default)] +pub(crate) struct RequestCounter(pub(crate) AtomicU32); + +impl Clone for RequestCounter { + fn clone(&self) -> Self { + RequestCounter(self.0.load(Ordering::Relaxed).into()) + } +} + /// Middleware for HTTP handlers which provides access to [Data] #[derive(Clone)] pub struct FederationMiddleware(pub(crate) FederationConfig); diff --git a/src/fetch/mod.rs b/src/fetch/mod.rs index 424a115..289c55d 100644 --- a/src/fetch/mod.rs +++ b/src/fetch/mod.rs @@ -106,7 +106,7 @@ async fn fetch_object_http_with_accept( config.verify_url_valid(url).await?; info!("Fetching remote object {}", url.to_string()); - let mut counter = data.request_counter.fetch_add(1, Ordering::SeqCst); + let mut counter = data.request_counter.0.fetch_add(1, Ordering::SeqCst); // fetch_add returns old value so we need to increment manually here counter += 1; if counter > config.http_fetch_limit {