use axum::{
body::Bytes,
http::header::HeaderMap,
http::{Method, Uri},
Router,
};
async fn echoreq(method: Method, uri: Uri, headers: HeaderMap, body: Bytes) -> String {
let headers = headers
.iter()
.map(|(k, v)| {
let v = v.to_str().unwrap_or_default();
format!("{k}: {}", v)
})
.collect::<Vec<String>>()
.join("\n");
let body = match String::from_utf8(body.to_vec()) {
Ok(body) => body,
Err(_) => printable_bytes(body),
};
println!("Received: {method} {uri}");
format!("{method} {uri}\n{headers}\n\n{body}")
}
pub fn router() -> Router {
Router::new().fallback(echoreq)
}
fn printable_bytes(v: Bytes) -> String {
let mut index = 0;
let len = v.len();
let mut out = vec!['.' as u8; len];
while index < len {
let oct = v[index];
match oct {
128.. => {
}
0..=8 | 11 | 12 | 14..=31 => {
}
_ => out[index] = oct,
}
index += 1;
}
unsafe { String::from_utf8_unchecked(out) }
}