diff --git a/Cargo.lock b/Cargo.lock index 8cee6e3..653667d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1580,9 +1580,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.142" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libgit2-sys" @@ -2951,9 +2951,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" dependencies = [ "autocfg", "bytes", @@ -2964,7 +2964,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "socket2", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 144ac81..05078a5 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -88,15 +88,7 @@ bytes = "1.4.0" shadow-rs = "0.17" [features] -default = [ - "desktop", - "previews", - "previews-image", - "extractors-web", - "extractors-audio", - "extractors-photo", - "extractors-media", -] +default = ["desktop", "previews", "previews-image", "extractors-web", "extractors-audio", "extractors-photo", "extractors-media"] desktop = ["webbrowser", "opener", "is_executable"] previews = [] previews-image = ["image", "webp", "kamadak-exif"] diff --git a/cli/src/routes.rs b/cli/src/routes.rs index c6d15ae..b2a2439 100644 --- a/cli/src/routes.rs +++ b/cli/src/routes.rs @@ -6,7 +6,6 @@ use actix_files::NamedFile; use actix_multipart::Multipart; use actix_web::error::{ ErrorBadRequest, ErrorInternalServerError, ErrorNotFound, ErrorUnauthorized, - ErrorUnprocessableEntity, }; use actix_web::http::header::ContentDisposition; use actix_web::{delete, error, get, post, put, web, Either, Error, HttpResponse}; @@ -534,7 +533,11 @@ pub async fn put_blob( } let url = Url::parse(&url_buffer).map_err(ErrorBadRequest)?; - let (bytes, filename) = fetch_external(url.clone()).await?; + + let _url = url.clone(); + let (bytes, filename) = web::block(move || fetch_external(_url)) + .await? + .map_err(ErrorInternalServerError)?; file.write_all(&bytes)?; ( @@ -686,7 +689,9 @@ pub async fn get_address( ) } else if let Some(url) = query.get("url_content") { let url = Url::parse(url).map_err(ErrorBadRequest)?; - let (bytes, _) = fetch_external(url).await?; + let (bytes, _) = web::block(|| fetch_external(url)) + .await? + .map_err(ErrorInternalServerError)?; let hash_result = hash(&bytes); (Address::Hash(hash_result), false) } else { @@ -858,12 +863,10 @@ pub async fn get_info(state: web::Data) -> Result { const MAX_EXTERNAL_SIZE: usize = 128_000_000; #[tracing::instrument(skip(url), fields(url=%url))] -async fn fetch_external(url: Url) -> Result<(bytes::Bytes, Option), actix_web::Error> { +fn fetch_external(url: Url) -> Result<(bytes::Bytes, Option)> { debug!("Fetching..."); - let response = web::block(|| REQWEST_CLIENT.get(url).send()) - .await? - .map_err(ErrorInternalServerError)?; + let response = REQWEST_CLIENT.get(url).send()?; if let Some(content_length) = response.headers().get(reqwest::header::CONTENT_LENGTH) { if let Some(content_length) = content_length @@ -872,15 +875,13 @@ async fn fetch_external(url: Url) -> Result<(bytes::Bytes, Option), acti .and_then(|cl| cl.parse::().ok()) { if content_length > MAX_EXTERNAL_SIZE { - return Err(ErrorBadRequest(format!( + return Err(anyhow!(format!( "Error: The response is too large ({content_length} > {MAX_EXTERNAL_SIZE})." ))); } } } else { - return Err(ErrorUnprocessableEntity( - "Error: Could not ascertain response size.", - )); + return Err(anyhow!("Error: Could not ascertain response size.",)); } let filename: Option = response @@ -890,7 +891,7 @@ async fn fetch_external(url: Url) -> Result<(bytes::Bytes, Option), acti .and_then(|cd| cd.get_filename().map(String::from)); debug!("Got filename: {filename:?}"); - let bytes = response.bytes().map_err(ErrorInternalServerError)?; + let bytes = response.bytes()?; debug!("Got {} bytes.", bytes.len()); Ok((bytes, filename))