2016-04-01 23:54:53 +00:00
|
|
|
use super::*;
|
|
|
|
use response::{HyperResponse, HyperFresh};
|
|
|
|
use request::HyperRequest;
|
|
|
|
|
|
|
|
use std::io::Read;
|
|
|
|
use term_painter::Color::*;
|
|
|
|
use term_painter::ToStyle;
|
|
|
|
|
|
|
|
use hyper::uri::RequestUri as HyperRequestUri;
|
|
|
|
use hyper::server::Server as HyperServer;
|
|
|
|
use hyper::server::Handler as HyperHandler;
|
|
|
|
|
|
|
|
pub struct Rocket {
|
|
|
|
address: &'static str,
|
|
|
|
port: isize,
|
|
|
|
router: Router
|
|
|
|
}
|
|
|
|
|
|
|
|
impl HyperHandler for Rocket {
|
|
|
|
fn handle<'a, 'k>(&'a self, mut req: HyperRequest<'a, 'k>,
|
|
|
|
res: HyperResponse<'a, HyperFresh>) {
|
|
|
|
println!("{} {:?} {:?}", White.paint("Incoming:"),
|
|
|
|
Green.paint(&req.method), Blue.paint(&req.uri));
|
|
|
|
|
|
|
|
let mut buf = vec![];
|
|
|
|
req.read_to_end(&mut buf); // FIXME: Simple DOS attack here.
|
|
|
|
if let HyperRequestUri::AbsolutePath(uri_string) = req.uri {
|
|
|
|
if let Some(method) = Method::from_hyp(req.method) {
|
|
|
|
|
|
|
|
let uri_str = uri_string.as_str();
|
|
|
|
let route = self.router.route(method, uri_str);
|
|
|
|
let mut response = route.map_or(Response::not_found(), |route| {
|
|
|
|
let params = route.get_params(uri_str);
|
2016-04-04 04:53:25 +00:00
|
|
|
let request = Request::new(params, uri_str, &buf);
|
2016-04-01 23:54:53 +00:00
|
|
|
(route.handler)(request)
|
|
|
|
});
|
|
|
|
|
|
|
|
println!("{}", Green.paint("\t=> Dispatched request."));
|
|
|
|
return response.respond(res);
|
|
|
|
}
|
|
|
|
|
|
|
|
println!("{}", Yellow.paint("\t=> Debug: Method::from_hyp failed!"));
|
|
|
|
}
|
|
|
|
|
|
|
|
println!("{}", Red.paint("\t=> Dispatch failed. Returning 404."));
|
|
|
|
Response::not_found().respond(res);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Rocket {
|
|
|
|
pub fn new(address: &'static str, port: isize) -> Rocket {
|
|
|
|
Rocket {
|
|
|
|
address: address,
|
|
|
|
port: port,
|
|
|
|
router: Router::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-02 07:51:40 +00:00
|
|
|
pub fn mount(&mut self, base: &'static str, routes: Vec<Route>) -> &mut Self {
|
2016-04-01 23:54:53 +00:00
|
|
|
println!("🛰 {} '{}':", Magenta.paint("Mounting"), Blue.paint(base));
|
2016-04-02 07:51:40 +00:00
|
|
|
for mut route in routes {
|
|
|
|
let path = format!("{}/{}", base, route.path.as_str());
|
|
|
|
route.set_path(path);
|
|
|
|
|
2016-04-01 23:54:53 +00:00
|
|
|
println!("\t* {}", route);
|
2016-04-02 07:51:40 +00:00
|
|
|
self.router.add(route);
|
2016-04-01 23:54:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn launch(self) {
|
|
|
|
if self.router.has_collisions() {
|
|
|
|
println!("{}", Yellow.paint("Warning: route collisions detected!"));
|
|
|
|
}
|
|
|
|
|
|
|
|
let full_addr = format!("{}:{}", self.address, self.port);
|
|
|
|
println!("🚀 {} {}...", White.paint("Rocket has launched from"),
|
2016-04-03 10:36:30 +00:00
|
|
|
White.bold().paint(&full_addr));
|
2016-04-01 23:54:53 +00:00
|
|
|
let _ = HyperServer::http(full_addr.as_str()).unwrap().handle(self);
|
|
|
|
}
|
2016-04-03 10:36:30 +00:00
|
|
|
|
|
|
|
pub fn mount_and_launch(mut self, base: &'static str, routes: Vec<Route>) {
|
|
|
|
self.mount(base, routes);
|
|
|
|
self.launch();
|
|
|
|
}
|
2016-04-01 23:54:53 +00:00
|
|
|
}
|