use crate::Result;
use crate::telemetry::reexports::http_body_util::BodyExt;
use hyper::body::Incoming;
use hyper::{Method, Request};
use std::fmt::Write;
pub(super) async fn pprof_symbol(req: Request<Incoming>) -> Result<String> {
let mut buf = String::new();
writeln!(buf, "num_symbols: 1")?;
let input = if req.method() == Method::POST {
let body = req.into_body().collect().await?.to_bytes();
String::from_utf8(body.to_vec())?
} else {
req.uri().query().unwrap_or_default().to_string()
};
for token in input.split('+') {
let hex_str = token
.trim()
.strip_prefix("0x")
.or_else(|| token.trim().strip_prefix("0X"))
.unwrap_or(token.trim());
let Ok(addr) = u64::from_str_radix(hex_str, 16) else {
continue;
};
backtrace::resolve(addr as usize as *mut std::ffi::c_void, |symbol| {
if let Some(name) = symbol.name() {
let _ = writeln!(buf, "{:#x}\t{}", addr, name);
}
});
}
Ok(buf)
}