From 63565712ade51fa69b954cdffb526160b08a0b61 Mon Sep 17 00:00:00 2001
From: Nutomic <me@nutomic.com>
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 078cfdb3..9be43016 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::<SendActivityTask>(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 {
-- 
2.44.1