1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-07-02 16:38:36 +00:00

Simplify the request limiting

This commit is contained in:
Reiner Herrmann 2023-08-19 23:39:35 +02:00
parent fc42243ec2
commit 2d9248ed3b
3 changed files with 17 additions and 46 deletions

View file

@ -13,7 +13,6 @@ use {
webpage::HTML, webpage::HTML,
reqwest::Url, reqwest::Url,
std::{io::Cursor, net::IpAddr, sync::Arc}, std::{io::Cursor, net::IpAddr, sync::Arc},
tokio::sync::Notify,
image::io::Reader as ImgReader, image::io::Reader as ImgReader,
}; };
@ -198,49 +197,21 @@ async fn get_url_preview(url: &str) -> Result<UrlPreviewData> {
return Ok(preview); return Ok(preview);
} }
let notif_opt = services() // ensure that only one request is made per URL
.media let mutex_request = Arc::clone(
.url_preview_requests services()
.read() .media
.unwrap() .url_preview_mutex
.get(url) .write()
.cloned(); .unwrap()
.entry(url.to_owned())
.or_default(),
);
let _request_lock = mutex_request.lock().await;
match notif_opt { match services().media.get_url_preview(url).await {
None => { Some(preview) => Ok(preview),
let notifier = Arc::new(Notify::new()); None => request_url_preview(url).await
{
services().media
.url_preview_requests
.write()
.unwrap()
.insert(url.to_owned(), notifier.clone());
}
let data = request_url_preview(url).await;
notifier.notify_waiters();
{
services().media.url_preview_requests.write().unwrap().remove(url);
}
data
}
Some(notifier) => {
// wait until being notified that request is finished
let notifier = notifier.clone();
let notifier = notifier.notified();
notifier.await;
services().media
.get_url_preview(url)
.await
.ok_or(Error::BadRequest(
ErrorKind::Unknown,
"No Preview available",
))
}
} }
} }

View file

@ -14,7 +14,7 @@ use image::imageops::FilterType;
use tokio::{ use tokio::{
fs::File, fs::File,
io::{AsyncReadExt, AsyncWriteExt, BufReader}, io::{AsyncReadExt, AsyncWriteExt, BufReader},
sync::Notify, sync::Mutex,
}; };
use serde::Serialize; use serde::Serialize;
@ -60,7 +60,7 @@ pub struct UrlPreviewData {
pub struct Service { pub struct Service {
pub db: &'static dyn Data, pub db: &'static dyn Data,
pub url_preview_requests: RwLock<HashMap<String, Arc<Notify>>>, pub url_preview_mutex: RwLock<HashMap<String, Arc<Mutex<()>>>>,
} }
impl Service { impl Service {

View file

@ -120,7 +120,7 @@ impl Services {
key_backups: key_backups::Service { db }, key_backups: key_backups::Service { db },
media: media::Service { media: media::Service {
db, db,
url_preview_requests: StdRwLock::new(HashMap::new()) url_preview_mutex: StdRwLock::new(HashMap::new()),
}, },
sending: sending::Service::build(db, &config), sending: sending::Service::build(db, &config),