diff --git a/src/error.rs b/src/error.rs index 1a3b7ac..3387c96 100644 --- a/src/error.rs +++ b/src/error.rs @@ -192,6 +192,9 @@ pub enum Error { #[error("tenant suspended due to invalid configuration")] TenantSuspended, + + #[error("Payload too large: {0}")] + PayloadTooLarge(String), } impl IntoResponse for Error { @@ -587,6 +590,12 @@ impl IntoResponse for Error { message: "Request Accepted, tenant suspended due to invalid configuration".to_string(), }, ], vec![]), + Error::PayloadTooLarge(message) => crate::handlers::Response::new_failure(StatusCode::BAD_REQUEST, vec![ + ResponseError { + name: "payload_too_large".to_string(), + message: format!("Payload too large: {}", message), + }, + ], vec![]), e => { warn!("Error does not have response clause, {:?}", e); diff --git a/src/handlers/push_message.rs b/src/handlers/push_message.rs index a6aecb7..75ae3f3 100644 --- a/src/handlers/push_message.rs +++ b/src/handlers/push_message.rs @@ -168,6 +168,18 @@ pub async fn handler_internal( ) })?; + // Check request body size shouldn't exceed 4Kb (FCM limitations) + if serde_json::to_string(&body) + .map_err(|e| (Error::InternalSerializationError(e), None))? + .len() + > 4096 + { + return Err(( + Error::PayloadTooLarge("Request body size should not exceed 4Kb".to_string()), + None, + )); + }; + let cloned_body = body.clone(); let push_message = if client.always_raw { if let Some(body) = body.raw {