miden_node_utils/
panic.rs1use std::any::Any;
2
3use http::{Response, StatusCode, header};
4use http_body_util::Full;
5pub use tower_http::catch_panic::CatchPanicLayer;
6
7pub fn catch_panic_layer_fn(err: Box<dyn Any + Send + 'static>) -> Response<Full<bytes::Bytes>> {
12 let err = stringify_panic_error(err);
14 tracing::error!(panic = true, "{err}");
15
16 Response::builder()
18 .status(StatusCode::INTERNAL_SERVER_ERROR)
19 .header(header::CONTENT_TYPE, "application/grpc")
20 .body(Full::from(""))
21 .unwrap()
22}
23
24fn stringify_panic_error(err: Box<dyn Any + Send + 'static>) -> String {
26 if let Some(&msg) = err.downcast_ref::<&str>() {
27 msg.to_string()
28 } else if let Ok(msg) = err.downcast::<String>() {
29 *msg
30 } else {
31 "unknown".to_string()
32 }
33}