use actix_web::{web::Json, App, HttpRequest, HttpServer, Responder}; use serde::Serialize; #[derive(Serialize)] struct EchoHeader { name: String, value: String, } #[derive(Serialize)] struct EchoResponse { method: String, path: String, host: String, headers: Vec, } impl EchoResponse { fn new(req: &HttpRequest) -> Self { let req_uri = req.uri(); let headers = req .headers() .iter() .map(|(header_name, header_value)| EchoHeader { name: header_name.to_string(), value: header_value.to_str().unwrap_or("ERROR").to_string(), }) .collect::>(); EchoResponse { method: req.method().to_string(), path: req_uri.path().to_string(), host: req_uri.host().unwrap_or("").to_string(), headers, } } } async fn echo_request(request: HttpRequest) -> actix_web::Result { let echo = EchoResponse::new(&request); Ok(Json(echo)) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().default_service(actix_web::web::route().to(echo_request))) .bind(("0.0.0.0", 8080))? .run() .await }