mirror of
https://github.com/tokio-rs/axum.git
synced 2026-09-08 00:00:24 +02:00
Fix recursive call leading to stack overflow when tracing level filter is TRACE (#3312)
This commit is contained in:
Generated
+1
@@ -407,6 +407,7 @@ dependencies = [
|
|||||||
"tower-layer",
|
"tower-layer",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
"typed-json",
|
"typed-json",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ multipart = ["dep:multer", "dep:fastrand"]
|
|||||||
protobuf = ["dep:prost"]
|
protobuf = ["dep:prost"]
|
||||||
scheme = []
|
scheme = []
|
||||||
query = ["dep:form_urlencoded", "dep:serde_html_form", "dep:serde_path_to_error"]
|
query = ["dep:form_urlencoded", "dep:serde_html_form", "dep:serde_path_to_error"]
|
||||||
tracing = ["axum-core/tracing", "axum/tracing"]
|
tracing = ["axum-core/tracing", "axum/tracing", "dep:tracing"]
|
||||||
typed-header = ["dep:headers"]
|
typed-header = ["dep:headers"]
|
||||||
typed-routing = ["dep:axum-macros", "dep:percent-encoding", "dep:serde_html_form", "dep:form_urlencoded"]
|
typed-routing = ["dep:axum-macros", "dep:percent-encoding", "dep:serde_html_form", "dep:form_urlencoded"]
|
||||||
|
|
||||||
@@ -92,6 +92,7 @@ serde_json = "1.0.71"
|
|||||||
tokio = { version = "1.14", features = ["full"] }
|
tokio = { version = "1.14", features = ["full"] }
|
||||||
tower = { version = "0.5.2", features = ["util"] }
|
tower = { version = "0.5.2", features = ["util"] }
|
||||||
tower-http = { version = "0.6.0", features = ["map-response-body", "timeout"] }
|
tower-http = { version = "0.6.0", features = ["map-response-body", "timeout"] }
|
||||||
|
tracing-subscriber = "0.3.19"
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|||||||
@@ -243,12 +243,13 @@ impl MultipartError {
|
|||||||
|
|
||||||
/// Get the response body text used for this rejection.
|
/// Get the response body text used for this rejection.
|
||||||
pub fn body_text(&self) -> String {
|
pub fn body_text(&self) -> String {
|
||||||
|
let body = self.source.to_string();
|
||||||
axum_core::__log_rejection!(
|
axum_core::__log_rejection!(
|
||||||
rejection_type = Self,
|
rejection_type = Self,
|
||||||
body_text = self.body_text(),
|
body_text = body,
|
||||||
status = self.status(),
|
status = self.status(),
|
||||||
);
|
);
|
||||||
self.source.to_string()
|
body
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the status code used for this rejection.
|
/// Get the status code used for this rejection.
|
||||||
@@ -398,4 +399,43 @@ mod tests {
|
|||||||
let res = client.post("/").multipart(form).await;
|
let res = client.post("/").multipart(form).await;
|
||||||
assert_eq!(res.status(), StatusCode::PAYLOAD_TOO_LARGE);
|
assert_eq!(res.status(), StatusCode::PAYLOAD_TOO_LARGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[cfg(feature = "tracing")]
|
||||||
|
async fn body_too_large_with_tracing() {
|
||||||
|
const BYTES: &[u8] = "<!doctype html><title>🦀</title>".as_bytes();
|
||||||
|
|
||||||
|
async fn handle(mut multipart: Multipart) -> impl IntoResponse {
|
||||||
|
let result: Result<(), MultipartError> = async {
|
||||||
|
while let Some(field) = multipart.next_field().await? {
|
||||||
|
field.bytes().await?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let subscriber = tracing_subscriber::FmtSubscriber::builder()
|
||||||
|
.with_max_level(tracing::level_filters::LevelFilter::TRACE)
|
||||||
|
.with_writer(std::io::sink)
|
||||||
|
.finish();
|
||||||
|
|
||||||
|
let guard = tracing::subscriber::set_default(subscriber);
|
||||||
|
let response = result.into_response();
|
||||||
|
drop(guard);
|
||||||
|
|
||||||
|
response
|
||||||
|
}
|
||||||
|
|
||||||
|
let app = Router::new()
|
||||||
|
.route("/", post(handle))
|
||||||
|
.layer(DefaultBodyLimit::max(BYTES.len() - 1));
|
||||||
|
|
||||||
|
let client = TestClient::new(app);
|
||||||
|
|
||||||
|
let form =
|
||||||
|
reqwest::multipart::Form::new().part("file", reqwest::multipart::Part::bytes(BYTES));
|
||||||
|
|
||||||
|
let res = client.post("/").multipart(form).await;
|
||||||
|
assert_eq!(res.status(), StatusCode::PAYLOAD_TOO_LARGE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user