diff --git a/src-tauri/src/external_recipe.rs b/src-tauri/src/external_recipe.rs index e7f44ee..6ac4a63 100644 --- a/src-tauri/src/external_recipe.rs +++ b/src-tauri/src/external_recipe.rs @@ -5,6 +5,7 @@ use std::str::FromStr; use anyhow::Result; use async_trait::async_trait; use regex::Regex; +use reqwest::Client; use url::Url; use crate::external_recipe::error::ExternalRecipeError; @@ -14,6 +15,17 @@ pub mod knusperstuebchen; pub mod pinterest; pub mod sallys_welt; +static CLIENT_ONCE_LOCK: OnceLock = OnceLock::new(); + +fn client() -> &'static Client { + CLIENT_ONCE_LOCK.get_or_init(|| { + reqwest::ClientBuilder::new() + .timeout(Duration::from_secs(10)) + .build() + .unwrap() + }) +} + #[derive(Debug, Clone, Default)] #[cfg_attr(test, derive(PartialEq))] pub struct ExternalRecipe { diff --git a/src-tauri/src/external_recipe/knusperstuebchen.rs b/src-tauri/src/external_recipe/knusperstuebchen.rs index 145b0db..aef45b5 100644 --- a/src-tauri/src/external_recipe/knusperstuebchen.rs +++ b/src-tauri/src/external_recipe/knusperstuebchen.rs @@ -22,7 +22,7 @@ pub struct ExternalRecipeGetter; impl ExternalRecipeGetterTrait for ExternalRecipeGetter { /// The recipes on Knusperstuebchen can be only a pdf or a pdf and structured html. async fn get(&self, url: Url) -> anyhow::Result { - let response = reqwest::get(url).await?; + let response = super::client().get(url).send().await?; let text = response.text().await?; let dom = Dom::create(text).await?; let name_element = dom.select("h1").await?.unwrap(); diff --git a/src-tauri/src/external_recipe/pinterest.rs b/src-tauri/src/external_recipe/pinterest.rs index cbf5362..389e460 100644 --- a/src-tauri/src/external_recipe/pinterest.rs +++ b/src-tauri/src/external_recipe/pinterest.rs @@ -74,13 +74,13 @@ pub struct ExternalRecipeGetter; impl ExternalRecipeGetterTrait for ExternalRecipeGetter { /// For `pin.it` URLs, we first need to find the canonical URL before trying to parse the HTML for the recipe data. async fn get(&self, url: Url) -> Result { - let response = reqwest::get(url.clone()).await?; + let response = super::client().get(url.clone()).send().await?; let mut text = response.text().await?; if let Some(prepared_url) = UrlMatch::prepare_url(&url) { if pin_it_uri_match().is_match(&prepared_url) { let dom = Dom::create(text).await?; let canonical_link = dom.canonical_link().await?; - let response = reqwest::get(canonical_link).await?; + let response = super::client().get(canonical_link).send().await?; text = response.text().await?; } } diff --git a/src-tauri/src/external_recipe/sallys_welt.rs b/src-tauri/src/external_recipe/sallys_welt.rs index 55db251..5a1606d 100644 --- a/src-tauri/src/external_recipe/sallys_welt.rs +++ b/src-tauri/src/external_recipe/sallys_welt.rs @@ -22,7 +22,7 @@ pub struct ExternalRecipeGetter; #[async_trait] impl ExternalRecipeGetterTrait for ExternalRecipeGetter { async fn get(&self, url: Url) -> Result { - let response = reqwest::get(url).await?; + let response = super::client().get(url).send().await?; let text = response.text().await?; let dom = Arc::new(Dom::create(text).await?); let mut steps = vec![];