From 63565712ade51fa69b954cdffb526160b08a0b61 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Tue, 1 Mar 2022 18:40:05 +0000 Subject: [PATCH] Fix resending activities (fixes #1282) (#2109) --- crates/apub_lib/src/activity_queue.rs | 39 +++++++++++++++++---------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/crates/apub_lib/src/activity_queue.rs b/crates/apub_lib/src/activity_queue.rs index 078cfdb3d..9be430167 100644 --- a/crates/apub_lib/src/activity_queue.rs +++ b/crates/apub_lib/src/activity_queue.rs @@ -1,5 +1,5 @@ use crate::{signatures::sign_and_send, traits::ActorType}; -use anyhow::{Context, Error}; +use anyhow::{anyhow, Context, Error}; use background_jobs::{ memory_storage::Storage, ActixJob, @@ -33,7 +33,13 @@ pub async fn send_activity( private_key: actor.private_key().context(location_info!())?, }; if env::var("APUB_TESTING_SEND_SYNC").is_ok() { - do_send(message, client).await?; + let res = do_send(message, client).await; + // Don't fail on error, as we intentionally do some invalid actions in tests, to verify that + // they are rejected on the receiving side. These errors shouldn't bubble up to make the API + // call fail. This matches the behaviour in production. + if let Err(e) = res { + warn!("{}", e); + } } else { activity_queue.queue::(message).await?; } @@ -77,26 +83,31 @@ async fn do_send(task: SendActivityTask, client: &ClientWithMiddleware) -> Resul ) .await; - match result { + let r: Result<(), Error> = match result { Ok(o) => { if !o.status().is_success() { let status = o.status(); let text = o.text().await?; - warn!( + Err(anyhow!( "Send {} to {} failed with status {}: {}", - task.activity_id, task.inbox, status, text, - ); + task.activity_id, + task.inbox, + status, + text, + )) + } else { + Ok(()) } } - Err(e) => { - warn!( - "Failed to send activity {} to {}: {}", - &task.activity_id, task.inbox, e - ); - } - } - Ok(()) + Err(e) => Err(anyhow!( + "Failed to send activity {} to {}: {}", + &task.activity_id, + task.inbox, + e + )), + }; + r } pub fn create_activity_queue(client: ClientWithMiddleware) -> Manager {