From: Nutomic <me@nutomic.com>
Date: Thu, 3 Mar 2022 18:40:10 +0000 (+0000)
Subject: Add timeout for sending activities (#2112)
X-Git-Url: http://these/git/%7B%24%7B%60data:application/%22%7Burl%7D/%7Bthis.imageSrc%7D?a=commitdiff_plain;h=fa29ffade1e0898895064abda9906af502fdf7b0;p=lemmy.git

Add timeout for sending activities (#2112)

* Add timeout for sending activities

* Also set request timeouts in utils/src/request.rs
---

diff --git a/crates/apub_lib/src/signatures.rs b/crates/apub_lib/src/signatures.rs
index 153eb745..2ee3a144 100644
--- a/crates/apub_lib/src/signatures.rs
+++ b/crates/apub_lib/src/signatures.rs
@@ -15,7 +15,7 @@ use reqwest::Response;
 use reqwest_middleware::ClientWithMiddleware;
 use serde::{Deserialize, Serialize};
 use sha2::{Digest, Sha256};
-use std::str::FromStr;
+use std::{str::FromStr, time::Duration};
 use tracing::debug;
 use url::Url;
 
@@ -46,6 +46,8 @@ pub async fn sign_and_send(
 
   let request = client
     .post(&inbox_url.to_string())
+    // signature is only valid for 10 seconds, so no reason to wait any longer
+    .timeout(Duration::from_secs(10))
     .headers(headers)
     .signature_with_digest(
       HTTP_SIG_CONFIG.clone(),
diff --git a/crates/utils/src/request.rs b/crates/utils/src/request.rs
index 144dd0bc..4f87c10a 100644
--- a/crates/utils/src/request.rs
+++ b/crates/utils/src/request.rs
@@ -4,7 +4,7 @@ use encoding::{all::encodings, DecoderTrap};
 use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
 use reqwest_middleware::ClientWithMiddleware;
 use serde::{Deserialize, Serialize};
-use std::future::Future;
+use std::{future::Future, time::Duration};
 use thiserror::Error;
 use tracing::{error, info};
 use url::Url;
@@ -69,7 +69,11 @@ pub async fn fetch_site_metadata(
   url: &Url,
 ) -> Result<SiteMetadata, LemmyError> {
   info!("Fetching site metadata for url: {}", url);
-  let response = client.get(url.as_str()).send().await?;
+  let response = client
+    .get(url.as_str())
+    .timeout(Duration::from_secs(30))
+    .send()
+    .await?;
 
   // Can't use .text() here, because it only checks the content header, not the actual bytes
   // https://github.com/LemmyNet/lemmy/issues/1964
@@ -177,7 +181,11 @@ pub(crate) async fn fetch_pictrs(
       utf8_percent_encode(image_url.as_str(), NON_ALPHANUMERIC) // TODO this might not be needed
     );
 
-    let response = client.get(&fetch_url).send().await?;
+    let response = client
+      .get(&fetch_url)
+      .timeout(Duration::from_secs(30))
+      .send()
+      .await?;
 
     let response: PictrsResponse = response
       .json()
@@ -249,7 +257,11 @@ pub async fn fetch_site_data(
 
 #[tracing::instrument(skip_all)]
 async fn is_image_content_type(client: &ClientWithMiddleware, url: &Url) -> Result<(), LemmyError> {
-  let response = client.get(url.as_str()).send().await?;
+  let response = client
+    .get(url.as_str())
+    .timeout(Duration::from_secs(30))
+    .send()
+    .await?;
   if response
     .headers()
     .get("Content-Type")