use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Method, Request, Response, Server, StatusCode}; use sha2::{Sha256, Digest}; use std::io::Write; /// This is our service handler. It receives a Request, routes on its /// path, and returns a Future of a Response. async fn echo(req: Request) -> Result, hyper::Error> { match (req.method(), req.uri().path()) { // Serve some instructions at / (&Method::GET, "/") => Ok(Response::new(Body::from( "Try POSTing data to /echo such as: `curl localhost:8000/echo -XPOST -d 'hello world'`", ))), // Simply echo the body back to the client. (&Method::POST, "/echo") => Ok(Response::new(req.into_body())), (&Method::POST, "/survey") => { let full_body = hyper::body::to_bytes(req.into_body()).await?; let mut hasher = Sha256::new(); hasher.update(full_body.clone()); let hash = hasher.finalize(); let mut file = std::fs::File::create( format!("answers-{}.age", hex::encode(hash)) ).unwrap(); file.write_all(&full_body).unwrap(); println!("got hash: {:?}", hash); Ok(Response::new( "thanks for hading in these answers!".into() )) } // Return the 404 Not Found for other routes. _ => { Ok(Response::builder() .status(StatusCode::NOT_FOUND) .body("nothing here!\n".into()) .unwrap() ) } } } #[tokio::main] async fn main() -> Result<(), Box> { let addr = ([127, 0, 0, 1], 8000).into(); let service = make_service_fn( |_| async { Ok::<_, hyper::Error>(service_fn(echo)) } ); let server = Server::bind(&addr).serve(service); println!("Listening on http://{}", addr); server.await?; Ok(()) }