From fb683fe88ba5e044b5681767fee0495ff125fe0f Mon Sep 17 00:00:00 2001 From: karribalu Date: Thu, 20 Jun 2024 23:55:09 +0100 Subject: [PATCH 1/3] Fix bad http status and error message on wrong payload --- meilisearch/src/error.rs | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/meilisearch/src/error.rs b/meilisearch/src/error.rs index 5a0b04020..84feea995 100644 --- a/meilisearch/src/error.rs +++ b/meilisearch/src/error.rs @@ -98,14 +98,27 @@ impl From for aweb::Error { impl From for MeilisearchHttpError { fn from(error: aweb::error::PayloadError) -> Self { - MeilisearchHttpError::Payload(PayloadError::Payload(error)) + match error { + aweb::error::PayloadError::Incomplete(_) => { + MeilisearchHttpError::Payload(PayloadError::Payload(ActixPayloadError::IncompleteError)) + } + _ => MeilisearchHttpError::Payload(PayloadError::Payload(ActixPayloadError::OtherError(error))) + } } } +#[derive(Debug, thiserror::Error)] +pub enum ActixPayloadError { + #[error("The provided payload is incomplete and cannot be decompressed")] + IncompleteError, + #[error(transparent)] + OtherError(aweb::error::PayloadError) +} + #[derive(Debug, thiserror::Error)] pub enum PayloadError { #[error(transparent)] - Payload(aweb::error::PayloadError), + Payload(ActixPayloadError), #[error(transparent)] Json(JsonPayloadError), #[error(transparent)] @@ -122,13 +135,15 @@ impl ErrorCode for PayloadError { fn error_code(&self) -> Code { match self { PayloadError::Payload(e) => match e { - aweb::error::PayloadError::Incomplete(_) => Code::Internal, - aweb::error::PayloadError::EncodingCorrupted => Code::Internal, - aweb::error::PayloadError::Overflow => Code::PayloadTooLarge, - aweb::error::PayloadError::UnknownLength => Code::Internal, - aweb::error::PayloadError::Http2Payload(_) => Code::Internal, - aweb::error::PayloadError::Io(_) => Code::Internal, - _ => todo!(), + ActixPayloadError::IncompleteError => Code::BadRequest, + ActixPayloadError::OtherError(error) => match error { + aweb::error::PayloadError::EncodingCorrupted => Code::Internal, + aweb::error::PayloadError::Overflow => Code::PayloadTooLarge, + aweb::error::PayloadError::UnknownLength => Code::Internal, + aweb::error::PayloadError::Http2Payload(_) => Code::Internal, + aweb::error::PayloadError::Io(_) => Code::Internal, + _ => todo!(), + } }, PayloadError::Json(err) => match err { JsonPayloadError::Overflow { .. } => Code::PayloadTooLarge, From 2a38f5c7571f49d33e315ad59ed7f28e9a203911 Mon Sep 17 00:00:00 2001 From: karribalu Date: Fri, 21 Jun 2024 00:14:26 +0100 Subject: [PATCH 2/3] Run Rustfmt --- meilisearch/src/error.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/meilisearch/src/error.rs b/meilisearch/src/error.rs index 84feea995..3a38b36d1 100644 --- a/meilisearch/src/error.rs +++ b/meilisearch/src/error.rs @@ -99,10 +99,12 @@ impl From for aweb::Error { impl From for MeilisearchHttpError { fn from(error: aweb::error::PayloadError) -> Self { match error { - aweb::error::PayloadError::Incomplete(_) => { - MeilisearchHttpError::Payload(PayloadError::Payload(ActixPayloadError::IncompleteError)) - } - _ => MeilisearchHttpError::Payload(PayloadError::Payload(ActixPayloadError::OtherError(error))) + aweb::error::PayloadError::Incomplete(_) => MeilisearchHttpError::Payload( + PayloadError::Payload(ActixPayloadError::IncompleteError), + ), + _ => MeilisearchHttpError::Payload(PayloadError::Payload( + ActixPayloadError::OtherError(error), + )), } } } @@ -112,7 +114,7 @@ pub enum ActixPayloadError { #[error("The provided payload is incomplete and cannot be decompressed")] IncompleteError, #[error(transparent)] - OtherError(aweb::error::PayloadError) + OtherError(aweb::error::PayloadError), } #[derive(Debug, thiserror::Error)] @@ -143,7 +145,7 @@ impl ErrorCode for PayloadError { aweb::error::PayloadError::Http2Payload(_) => Code::Internal, aweb::error::PayloadError::Io(_) => Code::Internal, _ => todo!(), - } + }, }, PayloadError::Json(err) => match err { JsonPayloadError::Overflow { .. } => Code::PayloadTooLarge, From 2608a596a069b1b7c1b76c6ee1fae99ee7dbb463 Mon Sep 17 00:00:00 2001 From: karribalu Date: Tue, 25 Jun 2024 18:36:29 +0100 Subject: [PATCH 3/3] Update error message and add tests for incomplete compressed document --- meilisearch/src/error.rs | 2 +- meilisearch/tests/documents/add_documents.rs | 52 ++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/meilisearch/src/error.rs b/meilisearch/src/error.rs index 3a38b36d1..96496a33f 100644 --- a/meilisearch/src/error.rs +++ b/meilisearch/src/error.rs @@ -111,7 +111,7 @@ impl From for MeilisearchHttpError { #[derive(Debug, thiserror::Error)] pub enum ActixPayloadError { - #[error("The provided payload is incomplete and cannot be decompressed")] + #[error("The provided payload is incomplete and cannot be parsed")] IncompleteError, #[error(transparent)] OtherError(aweb::error::PayloadError), diff --git a/meilisearch/tests/documents/add_documents.rs b/meilisearch/tests/documents/add_documents.rs index b1262fa2d..0169aade0 100644 --- a/meilisearch/tests/documents/add_documents.rs +++ b/meilisearch/tests/documents/add_documents.rs @@ -183,6 +183,58 @@ async fn add_single_document_gzip_encoded() { } "###); } +#[actix_rt::test] +async fn add_single_document_gzip_encoded_with_incomplete_error() { + let document = json!("kefir"); + + // this is a what is expected and should work + let server = Server::new().await; + let app = server.init_web_app().await; + // post + let document = serde_json::to_string(&document).unwrap(); + let req = test::TestRequest::post() + .uri("/indexes/dog/documents") + .set_payload(document.to_string()) + .insert_header(("content-type", "application/json")) + .insert_header(("content-encoding", "gzip")) + .to_request(); + let res = test::call_service(&app, req).await; + let status_code = res.status(); + let body = test::read_body(res).await; + let response: Value = serde_json::from_slice(&body).unwrap_or_default(); + snapshot!(status_code, @"400 Bad Request"); + snapshot!(json_string!(response), + @r###" + { + "message": "The provided payload is incomplete and cannot be parsed", + "code": "bad_request", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#bad_request" + } + "###); + + // put + let req = test::TestRequest::put() + .uri("/indexes/dog/documents") + .set_payload(document.to_string()) + .insert_header(("content-type", "application/json")) + .insert_header(("content-encoding", "gzip")) + .to_request(); + let res = test::call_service(&app, req).await; + let status_code = res.status(); + let body = test::read_body(res).await; + let response: Value = serde_json::from_slice(&body).unwrap_or_default(); + snapshot!(status_code, @"400 Bad Request"); + snapshot!(json_string!(response), + @r###" + { + "message": "The provided payload is incomplete and cannot be parsed", + "code": "bad_request", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#bad_request" + } + "###); +} /// Here we try document request with every encoding #[actix_rt::test]