fix: panics due to async black magic
parent
084660ab46
commit
fdc6a23e58
|
@ -1580,9 +1580,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.142"
|
version = "0.2.144"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
|
checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libgit2-sys"
|
name = "libgit2-sys"
|
||||||
|
@ -2951,9 +2951,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.27.0"
|
version = "1.28.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
|
checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
@ -2964,7 +2964,7 @@ dependencies = [
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"signal-hook-registry",
|
"signal-hook-registry",
|
||||||
"socket2",
|
"socket2",
|
||||||
"windows-sys 0.45.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -88,15 +88,7 @@ bytes = "1.4.0"
|
||||||
shadow-rs = "0.17"
|
shadow-rs = "0.17"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = [
|
default = ["desktop", "previews", "previews-image", "extractors-web", "extractors-audio", "extractors-photo", "extractors-media"]
|
||||||
"desktop",
|
|
||||||
"previews",
|
|
||||||
"previews-image",
|
|
||||||
"extractors-web",
|
|
||||||
"extractors-audio",
|
|
||||||
"extractors-photo",
|
|
||||||
"extractors-media",
|
|
||||||
]
|
|
||||||
desktop = ["webbrowser", "opener", "is_executable"]
|
desktop = ["webbrowser", "opener", "is_executable"]
|
||||||
previews = []
|
previews = []
|
||||||
previews-image = ["image", "webp", "kamadak-exif"]
|
previews-image = ["image", "webp", "kamadak-exif"]
|
||||||
|
|
|
@ -6,7 +6,6 @@ use actix_files::NamedFile;
|
||||||
use actix_multipart::Multipart;
|
use actix_multipart::Multipart;
|
||||||
use actix_web::error::{
|
use actix_web::error::{
|
||||||
ErrorBadRequest, ErrorInternalServerError, ErrorNotFound, ErrorUnauthorized,
|
ErrorBadRequest, ErrorInternalServerError, ErrorNotFound, ErrorUnauthorized,
|
||||||
ErrorUnprocessableEntity,
|
|
||||||
};
|
};
|
||||||
use actix_web::http::header::ContentDisposition;
|
use actix_web::http::header::ContentDisposition;
|
||||||
use actix_web::{delete, error, get, post, put, web, Either, Error, HttpResponse};
|
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 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)?;
|
file.write_all(&bytes)?;
|
||||||
|
|
||||||
(
|
(
|
||||||
|
@ -686,7 +689,9 @@ pub async fn get_address(
|
||||||
)
|
)
|
||||||
} else if let Some(url) = query.get("url_content") {
|
} else if let Some(url) = query.get("url_content") {
|
||||||
let url = Url::parse(url).map_err(ErrorBadRequest)?;
|
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);
|
let hash_result = hash(&bytes);
|
||||||
(Address::Hash(hash_result), false)
|
(Address::Hash(hash_result), false)
|
||||||
} else {
|
} 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;
|
const MAX_EXTERNAL_SIZE: usize = 128_000_000;
|
||||||
#[tracing::instrument(skip(url), fields(url=%url))]
|
#[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...");
|
debug!("Fetching...");
|
||||||
|
|
||||||
let response = web::block(|| REQWEST_CLIENT.get(url).send())
|
let response = REQWEST_CLIENT.get(url).send()?;
|
||||||
.await?
|
|
||||||
.map_err(ErrorInternalServerError)?;
|
|
||||||
|
|
||||||
if let Some(content_length) = response.headers().get(reqwest::header::CONTENT_LENGTH) {
|
if let Some(content_length) = response.headers().get(reqwest::header::CONTENT_LENGTH) {
|
||||||
if let Some(content_length) = 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())
|
.and_then(|cl| cl.parse::<usize>().ok())
|
||||||
{
|
{
|
||||||
if content_length > MAX_EXTERNAL_SIZE {
|
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})."
|
"Error: The response is too large ({content_length} > {MAX_EXTERNAL_SIZE})."
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Err(ErrorUnprocessableEntity(
|
return Err(anyhow!("Error: Could not ascertain response size.",));
|
||||||
"Error: Could not ascertain response size.",
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let filename: Option<String> = response
|
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));
|
.and_then(|cd| cd.get_filename().map(String::from));
|
||||||
debug!("Got filename: {filename:?}");
|
debug!("Got filename: {filename:?}");
|
||||||
|
|
||||||
let bytes = response.bytes().map_err(ErrorInternalServerError)?;
|
let bytes = response.bytes()?;
|
||||||
debug!("Got {} bytes.", bytes.len());
|
debug!("Got {} bytes.", bytes.len());
|
||||||
|
|
||||||
Ok((bytes, filename))
|
Ok((bytes, filename))
|
||||||
|
|
Loading…
Reference in New Issue