]> Untitled Git - lemmy.git/blob - server/src/request.rs
routes.api: fix get_captcha endpoint (#1135)
[lemmy.git] / server / src / request.rs
1 use anyhow::anyhow;
2 use lemmy_utils::LemmyError;
3 use std::future::Future;
4 use thiserror::Error;
5
6 #[derive(Clone, Debug, Error)]
7 #[error("Error sending request, {0}")]
8 struct SendError(pub String);
9
10 #[derive(Clone, Debug, Error)]
11 #[error("Error receiving response, {0}")]
12 pub struct RecvError(pub String);
13
14 pub async fn retry<F, Fut, T>(f: F) -> Result<T, LemmyError>
15 where
16   F: Fn() -> Fut,
17   Fut: Future<Output = Result<T, reqwest::Error>>,
18 {
19   retry_custom(|| async { Ok((f)().await) }).await
20 }
21
22 async fn retry_custom<F, Fut, T>(f: F) -> Result<T, LemmyError>
23 where
24   F: Fn() -> Fut,
25   Fut: Future<Output = Result<Result<T, reqwest::Error>, LemmyError>>,
26 {
27   let mut response = Err(anyhow!("connect timeout").into());
28
29   for _ in 0u8..3 {
30     match (f)().await? {
31       Ok(t) => return Ok(t),
32       Err(e) => {
33         if e.is_timeout() {
34           response = Err(SendError(e.to_string()).into());
35           continue;
36         }
37         return Err(SendError(e.to_string()).into());
38       }
39     }
40   }
41
42   response
43 }