65 lines
1.6 KiB
Rust
65 lines
1.6 KiB
Rust
use actix_web::{web::Json, App, HttpRequest, HttpServer, Responder};
|
|
use clap::Parser;
|
|
use serde::Serialize;
|
|
use std::collections::BTreeMap;
|
|
|
|
#[derive(Parser)]
|
|
#[command(author, version, about, long_about = None)]
|
|
struct CliArgs {
|
|
/// Port to run on.
|
|
#[arg(short, long, default_value_t = 8080)]
|
|
port: u16,
|
|
|
|
/// Listen to IP mask
|
|
#[arg(short, long, default_value = "0.0.0.0")]
|
|
ips: String,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct EchoHeader {
|
|
name: String,
|
|
value: String,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct EchoResponse {
|
|
method: String,
|
|
path: String,
|
|
host: String,
|
|
headers: BTreeMap<String, String>,
|
|
}
|
|
|
|
impl EchoResponse {
|
|
fn new(req: &HttpRequest) -> Self {
|
|
let req_uri = req.uri();
|
|
let mut headers = BTreeMap::new();
|
|
for (header_name, header_value) in req.headers().iter() {
|
|
headers.insert(
|
|
header_name.to_string(),
|
|
header_value.to_str().unwrap_or("ERROR").to_string(),
|
|
);
|
|
}
|
|
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<impl Responder> {
|
|
let echo = EchoResponse::new(&request);
|
|
Ok(Json(echo))
|
|
}
|
|
|
|
#[actix_web::main]
|
|
async fn main() -> std::io::Result<()> {
|
|
let cli_args = CliArgs::parse();
|
|
let listen_on = (cli_args.ips, cli_args.port);
|
|
HttpServer::new(|| App::new().default_service(actix_web::web::route().to(echo_request)))
|
|
.bind(listen_on)?
|
|
.run()
|
|
.await
|
|
}
|