use std::convert::Infallible; use hyper::service; use hyper::{Body, Request, Response, Server}; use hyper::http::Method; use hyper::body::HttpBody; async fn hello(request: Request) -> Result, Infallible> { let mut buff = String::with_capacity(1024); buff.push_str(&request.method().to_string()); buff.push(' '); buff.push_str(&request.uri().to_string()); buff.push(' '); buff.push_str(&format!("{:?}", request.version().to_owned())); buff.push('\n'); buff.push_str(&"=".repeat(88)); buff.push('\n'); for header in request.headers() { buff.push_str(&header.0.to_string()); buff.push_str(": "); let val = header.1.to_str().unwrap_or_else(|_| ""); if header.0.to_string().contains("access-key-secret") && !val.is_empty() { buff.push_str("******"); } else { buff.push_str(val); } buff.push('\n'); } buff.push_str(&"=".repeat(88)); buff.push('\n'); if request.method() == Method::POST { let mut request = request; let body = request.body_mut().data().await; match body { None => buff.push_str(""), Some(Err(e)) => buff.push_str(&format!("", e)), Some(Ok(body)) => buff.push_str(&String::from_utf8_lossy(&*body)), } } buff.push_str(&"=".repeat(88)); buff.push('\n'); Ok(Response::new(Body::from(buff))) } #[tokio::main] pub async fn main() -> Result<(), Box> { let make_svc = service::make_service_fn(|_conn| { async { Ok::<_, Infallible>(service::service_fn(hello)) } }); let addr = ([0, 0, 0, 0], 9000).into(); let server = Server::bind(&addr).serve(make_svc); println!("Listening on http://{}", addr); server.await?; Ok(()) }