extern crate digest_headers;
extern crate futures;
extern crate hyper;
use digest_headers::use_hyper::DigestHeader;
use futures::{Future, Stream};
use hyper::server::{Http, Request, Response, Service};
struct Responder;
impl Service for Responder {
type Request = Request;
type Response = Response;
type Error = hyper::Error;
type Future = Box<Future<Item = Self::Response, Error = Self::Error>>;
fn call(&self, mut req: Self::Request) -> Self::Future {
let digest = req.headers_mut()
.remove::<DigestHeader>()
.ok_or(hyper::Error::Header);
let fut = req.body()
.concat2()
.join(digest)
.and_then(|(body, digest)| {
if digest.0.verify(&body).is_ok() {
println!("Verified!");
Ok(Response::new().with_body(body))
} else {
println!("Bad Request!");
Err(hyper::Error::Header)
}
});
Box::new(fut)
}
}
fn main() {
let addr = "127.0.0.1:8000".parse().unwrap();
let server = Http::new().bind(&addr, || Ok(Responder)).unwrap();
server.run().unwrap();
}