use tiny_http::{Header, Method, Response, Server};
pub fn serve(addr: &str) -> u8 {
let server = match Server::http(addr) {
Ok(s) => s,
Err(e) => {
eprintln!("zenith mcp: cannot bind '{addr}': {e}");
return 1;
}
};
eprintln!("zenith mcp: HTTP transport listening on {addr}");
for mut request in server.incoming_requests() {
if *request.method() != Method::Post {
let _ = request.respond(Response::empty(405));
continue;
}
let mut body = String::new();
if request.as_reader().read_to_string(&mut body).is_err() {
let _ = request.respond(Response::empty(400));
continue;
}
match super::handle_message(&body) {
Some(response) => {
let mut http_response = Response::from_string(response.to_string());
if let Ok(header) =
Header::from_bytes(&b"Content-Type"[..], &b"application/json"[..])
{
http_response.add_header(header);
}
let _ = request.respond(http_response);
}
None => {
let _ = request.respond(Response::empty(202));
}
}
}
0
}