diff --git a/meilisearch/src/error.rs b/meilisearch/src/error.rs index 5a0b04020..96496a33f 100644 --- a/meilisearch/src/error.rs +++ b/meilisearch/src/error.rs @@ -98,14 +98,29 @@ 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 parsed")] + 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 +137,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, diff --git a/meilisearch/tests/documents/add_documents.rs b/meilisearch/tests/documents/add_documents.rs index 85fc61503..5e32564c7 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]