diff --git a/src/routes/project_creation.rs b/src/routes/project_creation.rs index 6eee7e798..6e97f6b12 100644 --- a/src/routes/project_creation.rs +++ b/src/routes/project_creation.rs @@ -10,6 +10,7 @@ use crate::search::indexing::IndexingError; use crate::util::auth::{get_user_from_headers, AuthenticationError}; use crate::util::routes::read_from_field; use crate::util::validate::validation_errors_to_string; +use actix::fut::ready; use actix_multipart::{Field, Multipart}; use actix_web::http::StatusCode; use actix_web::web::Data; @@ -250,7 +251,7 @@ pub async fn undo_uploads( #[post("project")] pub async fn project_create( req: HttpRequest, - payload: Multipart, + mut payload: Multipart, client: Data, file_host: Data>, ) -> Result { @@ -259,7 +260,7 @@ pub async fn project_create( let result = project_create_inner( req, - payload, + &mut payload, &mut transaction, &***file_host, &mut uploaded_files, @@ -270,6 +271,9 @@ pub async fn project_create( let undo_result = undo_uploads(&***file_host, &uploaded_files).await; let rollback_result = transaction.rollback().await; + // fix multipart error bug: + payload.for_each(|_| ready(())).await; + if let Err(e) = undo_result { return Err(e); } @@ -314,7 +318,7 @@ Get logged in user pub async fn project_create_inner( req: HttpRequest, - mut payload: Multipart, + payload: &mut Multipart, transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>, file_host: &dyn FileHost, uploaded_files: &mut Vec, diff --git a/src/routes/v1/mods.rs b/src/routes/v1/mods.rs index 6f1c409ac..ffc6cf825 100644 --- a/src/routes/v1/mods.rs +++ b/src/routes/v1/mods.rs @@ -116,7 +116,7 @@ pub async fn mods_get( #[post("mod")] pub async fn mod_create( req: HttpRequest, - payload: Multipart, + mut payload: Multipart, client: Data, file_host: Data>, ) -> Result { @@ -125,7 +125,7 @@ pub async fn mod_create( let result = project_create_inner( req, - payload, + &mut payload, &mut transaction, &***file_host, &mut uploaded_files, diff --git a/src/routes/version_creation.rs b/src/routes/version_creation.rs index 13a848cb5..571a2080c 100644 --- a/src/routes/version_creation.rs +++ b/src/routes/version_creation.rs @@ -15,6 +15,7 @@ use crate::util::auth::get_user_from_headers; use crate::util::routes::read_from_field; use crate::util::validate::validation_errors_to_string; use crate::validate::{validate_file, ValidationResult}; +use actix::fut::ready; use actix_multipart::{Field, Multipart}; use actix_web::web::Data; use actix_web::{post, HttpRequest, HttpResponse}; @@ -65,7 +66,7 @@ struct InitialFileData { #[post("version")] pub async fn version_create( req: HttpRequest, - payload: Multipart, + mut payload: Multipart, client: Data, file_host: Data>, ) -> Result { @@ -74,7 +75,7 @@ pub async fn version_create( let result = version_create_inner( req, - payload, + &mut payload, &mut transaction, &***file_host, &mut uploaded_files, @@ -89,6 +90,8 @@ pub async fn version_create( .await; let rollback_result = transaction.rollback().await; + payload.for_each(|_| ready(())).await; + if let Err(e) = undo_result { return Err(e); } @@ -104,7 +107,7 @@ pub async fn version_create( async fn version_create_inner( req: HttpRequest, - mut payload: Multipart, + payload: &mut Multipart, transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>, file_host: &dyn FileHost, uploaded_files: &mut Vec, @@ -428,7 +431,7 @@ async fn version_create_inner( pub async fn upload_file_to_version( req: HttpRequest, url_data: actix_web::web::Path<(VersionId,)>, - payload: Multipart, + mut payload: Multipart, client: Data, file_host: Data>, ) -> Result { @@ -439,7 +442,7 @@ pub async fn upload_file_to_version( let result = upload_file_to_version_inner( req, - payload, + &mut payload, client, &mut transaction, &***file_host, @@ -456,6 +459,8 @@ pub async fn upload_file_to_version( .await; let rollback_result = transaction.rollback().await; + payload.for_each(|_| ready(())).await; + if let Err(e) = undo_result { return Err(e); } @@ -471,7 +476,7 @@ pub async fn upload_file_to_version( async fn upload_file_to_version_inner( req: HttpRequest, - mut payload: Multipart, + payload: &mut Multipart, client: Data, transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>, file_host: &dyn FileHost,