From a8ea85f9719f71551bdc6812fb23fd5df8cef725 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Tue, 11 Jun 2024 05:04:28 +0300 Subject: [PATCH] fix: possibly fix safebooru retry --- Cargo.lock | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 2 +- src/main.rs | 38 ++++++++++++++++++++++-------------- 3 files changed, 80 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 525bfae..d847b06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -211,6 +211,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.30" @@ -218,6 +233,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -226,6 +242,23 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + [[package]] name = "futures-macro" version = "0.3.30" @@ -237,6 +270,23 @@ dependencies = [ "syn", ] +[[package]] +name = "futures-retry" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde5a672a61f96552aa5ed9fd9c81c3fbdae4be9b1e205d6eaf17c83705adc0f" +dependencies = [ + "futures", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + [[package]] name = "futures-task" version = "0.3.30" @@ -249,9 +299,13 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", + "futures-io", "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -560,7 +614,7 @@ dependencies = [ "dashmap", "fastrand", "form_urlencoded", - "futures-util", + "futures-retry", "http", "maud", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 96ee4b0..03a0692 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,4 +14,4 @@ maud = "0.26" signal-hook = "0.3" serde_json = "1" form_urlencoded = "1" -futures-util = "0.3" \ No newline at end of file +futures-retry = "0.6" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 8581eaa..254987e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,6 @@ use axum::{ use dashmap::DashMap; use data::{Art, ArtKind, Data}; use error::AppResult; -use futures_util::TryFutureExt; use http::Uri; use maud::PreEscaped; use std::{ @@ -123,20 +122,31 @@ async fn fetch_safebooru_image_link(http: &reqwest::Client, url: &Uri) -> AppRes let url = format!("https://safebooru.org/index.php?page=dapi&s=post&q=index&json=1&id={id}"); type Data = Vec>; - async fn try_request(count: usize, url: &str, http: &reqwest::Client) -> AppResult { - println!("[safebooru] trying to fetch url (count {count}): {url}"); - let req = http.get(url).build()?; - let resp = http.execute(req).await?.error_for_status()?; - let data = resp.json::().await?; - AppResult::Ok(data) - } + let try_request = || { + let url = url.clone(); + let http = http.clone(); + async move { + println!("[safebooru] trying to fetch url (count 0): {url}"); + let req = http.get(url).build()?; + let resp = http.execute(req).await?.error_for_status()?; + let data = resp.json::().await?; + AppResult::Ok(data) + } + }; - let data = try_request(0, &url, http) - .or_else(|_| try_request(1, &url, http)) - .or_else(|_| try_request(2, &url, http)) - .or_else(|_| try_request(3, &url, http)) - .or_else(|_| try_request(4, &url, http)) - .await?; + let mut attempts: usize = 0; + let (data, _) = futures_retry::FutureRetry::new(try_request, |e| { + if attempts > 4 { + futures_retry::RetryPolicy::::ForwardError(e) + } else { + attempts += 1; + futures_retry::RetryPolicy::::WaitRetry( + std::time::Duration::from_secs(1), + ) + } + }) + .await + .map_err(|(e, _)| e)?; let image_filename = data[0].get("image").unwrap().as_str().unwrap(); let image_directory = data[0].get("directory").unwrap().as_str().unwrap();