From 617ea3614e30540b0ca24536cf84057a20cd6658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Pie=C5=84kowski?= <4557247-Jakski@users.noreply.gitlab.com> Date: Thu, 3 Jul 2025 19:23:03 +0000 Subject: [PATCH] fix: Respond with HTTP code 413, when request size is too big --- Cargo.lock | 1 + Cargo.toml | 1 + src/api/ruma_wrapper/axum.rs | 10 +++++++++- src/utils/error.rs | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 6bb2699d..2a48d656 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -510,6 +510,7 @@ dependencies = [ "hickory-resolver", "hmac", "http", + "http-body-util", "humantime", "humantime-serde", "hyper", diff --git a/Cargo.toml b/Cargo.toml index 557b155b..cba97538 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -152,6 +152,7 @@ tikv-jemallocator = { version = "0.6", features = [ ], optional = true } sd-notify = { version = "0.4", optional = true } +http-body-util = "0.1.3" # Used for matrix spec type definitions and helpers [dependencies.ruma] diff --git a/src/api/ruma_wrapper/axum.rs b/src/api/ruma_wrapper/axum.rs index f933796e..5fa7cd29 100644 --- a/src/api/ruma_wrapper/axum.rs +++ b/src/api/ruma_wrapper/axum.rs @@ -59,7 +59,15 @@ where .unwrap_or(usize::MAX), ) .await - .map_err(|_| Error::BadRequest(ErrorKind::MissingToken, "Missing token."))?; + .map_err(|err| { + if std::error::Error::source(&err).as_ref().and_then(|err| std::error::Error::source(err)).is_some() { + Error::BadRequest( + ErrorKind::ResourceLimitExceeded{ admin_contact: String::default() }, + "Reached maximum request size") + } else { + Error::BadRequest(ErrorKind::Unknown, "An unknown error has occurred") + } + })?; (parts, body) }; diff --git a/src/utils/error.rs b/src/utils/error.rs index 1b1a26db..943df398 100644 --- a/src/utils/error.rs +++ b/src/utils/error.rs @@ -123,6 +123,7 @@ impl Error { Unauthorized | UnknownToken { .. } | MissingToken => StatusCode::UNAUTHORIZED, NotFound | Unrecognized => StatusCode::NOT_FOUND, LimitExceeded { .. } => StatusCode::TOO_MANY_REQUESTS, + ResourceLimitExceeded { .. } => StatusCode::PAYLOAD_TOO_LARGE, UserDeactivated => StatusCode::FORBIDDEN, TooLarge => StatusCode::PAYLOAD_TOO_LARGE, ConnectionTimeout => StatusCode::GATEWAY_TIMEOUT,