]> Untitled Git - lemmy.git/commitdiff
Fix retry infinite loops. Fixes #1964 (#1967)
authorDessalines <dessalines@users.noreply.github.com>
Sun, 5 Dec 2021 15:03:13 +0000 (10:03 -0500)
committerGitHub <noreply@github.com>
Sun, 5 Dec 2021 15:03:13 +0000 (10:03 -0500)
* Fix retry infinite loops. Fixes #1964

* Moving retry_limit to settings

config/defaults.hjson
crates/apub/src/fetcher/webfinger.rs
crates/apub_lib/src/object_id.rs
crates/utils/src/request.rs
crates/utils/src/settings/structs.rs

index 003adf11a78389864d99cfbd2c85174734a02c22..14c1dce0bd33847c3dd7e3ad67b12afc3ceac351 100644 (file)
   slur_filter: "(\bThis\b)|(\bis\b)|(\bsample\b)"
   # Maximum length of local community and user names
   actor_name_max_length: 20
+  # Maximum number of HTTP requests allowed to handle a single incoming activity (or a single object fetch through the search).
+  http_fetch_retry_limit: 25
 }
index 93986a50f80f594d4873408245d5e3f7863459e4..b44030b06fc6d2d0fe2cd363f4009c9651a71a46 100644 (file)
@@ -81,6 +81,11 @@ where
   );
   debug!("Fetching webfinger url: {}", &fetch_url);
 
+  *request_counter += 1;
+  if *request_counter > context.settings().http_fetch_retry_limit {
+    return Err(LemmyError::from(anyhow!("Request retry limit reached")));
+  }
+
   let response = retry(|| context.client().get(&fetch_url).send()).await?;
 
   let res: WebfingerResponse = response
index 59898e6691cf409d744da12a80923c84f94232fd..e8d0bd6d2ad03c435992f469b30480cd6c90f88c 100644 (file)
@@ -18,10 +18,6 @@ use std::{
 use tracing::info;
 use url::Url;
 
-/// Maximum number of HTTP requests allowed to handle a single incoming activity (or a single object
-/// fetch through the search). This should be configurable.
-static REQUEST_LIMIT: i32 = 25;
-
 static CLIENT: Lazy<Client> = Lazy::new(|| {
   Client::builder()
     .user_agent(build_user_agent(&Settings::get()))
@@ -119,8 +115,8 @@ where
     info!("Fetching remote object {}", self.to_string());
 
     *request_counter += 1;
-    if *request_counter > REQUEST_LIMIT {
-      return Err(LemmyError::from(anyhow!("Request limit reached")));
+    if *request_counter > Settings::get().http_fetch_retry_limit {
+      return Err(LemmyError::from(anyhow!("Request retry limit reached")));
     }
 
     let res = retry(|| {
index c2434f86b4d2e4ac2fd5e2f123a87b532a36d879..88680c0806602fdec595fdf4b2e4e7832110f9ea 100644 (file)
@@ -58,7 +58,7 @@ pub struct SiteMetadata {
 
 /// Fetches the post link html tags (like title, description, image, etc)
 pub async fn fetch_site_metadata(client: &Client, url: &Url) -> Result<SiteMetadata, LemmyError> {
-  let response = retry(|| client.get(url.as_str()).send()).await?;
+  let response = client.get(url.as_str()).send().await?;
 
   let html = response
     .text()
@@ -132,7 +132,7 @@ pub(crate) async fn fetch_pictrs(
       utf8_percent_encode(image_url.as_str(), NON_ALPHANUMERIC) // TODO this might not be needed
     );
 
-    let response = retry(|| client.get(&fetch_url).send()).await?;
+    let response = client.get(&fetch_url).send().await?;
 
     let response: PictrsResponse = response
       .json()
@@ -201,8 +201,8 @@ pub async fn fetch_site_data(
   }
 }
 
-async fn is_image_content_type(client: &Client, test: &Url) -> Result<(), LemmyError> {
-  let response = retry(|| client.get(test.to_owned()).send()).await?;
+async fn is_image_content_type(client: &Client, url: &Url) -> Result<(), LemmyError> {
+  let response = client.get(url.as_str()).send().await?;
   if response
     .headers()
     .get("Content-Type")
index 1b8ac812efd3ed0c8507a1978939f99eb42b7d65..6a20386e7b3b590cb88ab493b86918f5981328c0 100644 (file)
@@ -46,6 +46,9 @@ pub struct Settings {
   /// Maximum length of local community and user names
   #[default(20)]
   pub actor_name_max_length: usize,
+  /// Maximum number of HTTP requests allowed to handle a single incoming activity (or a single object fetch through the search).
+  #[default(25)]
+  pub http_fetch_retry_limit: i32,
 }
 
 #[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]