From 6efa33f00617c46ef49f1affa27f4acb63f5e1b8 Mon Sep 17 00:00:00 2001 From: dullbananas Date: Mon, 16 Jun 2025 02:33:10 -0700 Subject: [PATCH] Implement Clone for Data struct (#145) * add clone impl * fmt * wrap field instead of implementing clone for whole data struct --- src/config.rs | 15 +++++++++++++-- src/fetch/mod.rs | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) 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 {