use peta::server::{Http, Response, Server, StatusMessage};
use peta::{prelude::*, runtime};
use std::time::{Duration, Instant};
use tokio::net::TcpListener;
use tokio::timer::Delay;
use std::thread;
fn main() {
let addr = "0.0.0.0:3002";
let server = Server::new(&addr)
.map_err(|e| println!("failed to accept socket; error = {:?}", e))
.for_each(|socket| {
let (read, write) = socket.split();
let conn = Http::new(read)
.map_err(|e| println!("Error in http parsing; err={:?}", e))
.fold(write, |write, req| {
let path = req.path();
let rsp = Response::new().header("Content-Type", "text/plain");
match path {
"/" => hello_world(rsp),
"/delay" => delay(rsp),
_ => not_found(rsp),
}
.and_then(move |rsp| rsp.write(write))
.map_err(|e| println!("Error while writing response; err={:?}", e))
})
.map(|_| {
println!("Connection closed");
()
});
runtime::spawn(conn)
});
println!("Server is listening on {}", addr);
runtime::run(server);
}
pub fn hello_world(rsp: Response) -> Box<Future<Item = Response, Error = std::io::Error>> {
let hello = futures::future::ok(
rsp
.status(StatusMessage::OK)
.body("Hello world"),
);
Box::new(hello)
}
pub fn delay(rsp: Response) -> Box<Future<Item = Response, Error = std::io::Error>> {
let when = Instant::now() + Duration::from_millis(2000);
let delay = Delay::new(when)
.map_err(|e| panic!("Delay errored; err={:?}", e))
.and_then(move |_| {
Ok(
rsp
.status(StatusMessage::OK)
.body("Got in delay page 2000ms"),
)
});
Box::new(delay)
}
pub fn not_found(rsp: Response) -> Box<Future<Item = Response, Error = std::io::Error>> {
let at404 = futures::future::ok(
rsp
.status(StatusMessage::NOT_FOUND)
.body("Could not find"),
);
Box::new(at404)
}