mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-09-01 00:59:33 +00:00
fix: add CatchPanicLayer to capture handler panics
Without this, panics in async handlers silently drop the connection and the edge proxy returns a generic 503. Now panics are caught, logged, and returned as 500 with the panic message. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
5692fcd37d
commit
55c8ca4347
@@ -629,6 +629,25 @@ pub async fn start_server(
|
||||
.merge(projects)
|
||||
.merge(protected)
|
||||
.layer(DefaultBodyLimit::max(10 * 1024 * 1024)) // 10 MB max request body (image uploads)
|
||||
.layer(tower_http::catch_panic::CatchPanicLayer::custom(
|
||||
|panic_info: Box<dyn std::any::Any + Send + 'static>| {
|
||||
let detail = if let Some(s) = panic_info.downcast_ref::<String>() {
|
||||
s.clone()
|
||||
} else if let Some(s) = panic_info.downcast_ref::<&str>() {
|
||||
(*s).to_string()
|
||||
} else {
|
||||
"unknown panic".to_string()
|
||||
};
|
||||
tracing::error!("Handler panicked: {}", detail);
|
||||
axum::http::Response::builder()
|
||||
.status(axum::http::StatusCode::INTERNAL_SERVER_ERROR)
|
||||
.header("content-type", "text/plain")
|
||||
.body(axum::body::Body::from(format!("Internal Server Error: {detail}")))
|
||||
.unwrap_or_else(|_| {
|
||||
axum::http::Response::new(axum::body::Body::from("Internal Server Error"))
|
||||
})
|
||||
},
|
||||
))
|
||||
.layer(cors)
|
||||
.layer(SetResponseHeaderLayer::if_not_present(
|
||||
header::X_CONTENT_TYPE_OPTIONS,
|
||||
|
||||
Reference in New Issue
Block a user