@@ -65,6 +65,7 @@ use self::{
6565use crate :: {
6666 SourceSender ,
6767 codecs:: DecodingConfig ,
68+ common:: http:: ErrorMessage ,
6869 config:: { DataType , Resource , SourceConfig , SourceContext , SourceOutput , log_schema} ,
6970 event:: { Event , LogEvent , Value } ,
7071 http:: { KeepaliveConfig , MaxConnectionAgeLayer , build_http_trace_layer} ,
@@ -2014,6 +2015,8 @@ async fn finish_err(rejection: Rejection) -> Result<(Response,), Rejection> {
20142015 response_json ( StatusCode :: BAD_REQUEST , splunk_response:: ACK_IS_DISABLED )
20152016 }
20162017 } , ) )
2018+ } else if let Some ( error) = rejection. find :: < ErrorMessage > ( ) {
2019+ Ok ( ( response_json ( error. status_code ( ) , error) , ) )
20172020 } else {
20182021 Err ( rejection)
20192022 }
@@ -2084,6 +2087,22 @@ mod tests {
20842087 crate :: test_util:: test_generate_config :: < SplunkConfig > ( ) ;
20852088 }
20862089
2090+ #[ tokio:: test]
2091+ async fn finish_err_maps_capped_body_to_client_error ( ) {
2092+ // `capped_body()` rejects oversized payloads with an `ErrorMessage` (e.g. 413). The
2093+ // recovery must surface that status instead of letting it fall through to a 500.
2094+ let rejection = warp:: reject:: custom ( ErrorMessage :: new (
2095+ StatusCode :: PAYLOAD_TOO_LARGE ,
2096+ "Request body exceeds limit of 1024 bytes." . to_owned ( ) ,
2097+ ) ) ;
2098+
2099+ let ( response, ) = finish_err ( rejection)
2100+ . await
2101+ . expect ( "capped-body rejection should be recovered" ) ;
2102+
2103+ assert_eq ! ( response. status( ) , StatusCode :: PAYLOAD_TOO_LARGE ) ;
2104+ }
2105+
20872106 /// Splunk token
20882107 const TOKEN : & str = "token" ;
20892108 const VALID_TOKENS : & [ & str ; 2 ] = & [ TOKEN , "secondary-token" ] ;
0 commit comments