fix: panics due to async black magic

feat/type-attributes
Tomáš Mládek 2023-05-24 11:36:23 +02:00
parent 084660ab46
commit fdc6a23e58
3 changed files with 19 additions and 26 deletions

10
Cargo.lock generated
View File

@ -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]]

View File

@ -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"]

View File

@ -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<State>) -> Result<HttpResponse, Error> {
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<String>), actix_web::Error> {
fn fetch_external(url: Url) -> Result<(bytes::Bytes, Option<String>)> {
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<String>), acti
.and_then(|cl| cl.parse::<usize>().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<String> = response
@ -890,7 +891,7 @@ async fn fetch_external(url: Url) -> Result<(bytes::Bytes, Option<String>), 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))