diff --git a/src/main.rs b/src/main.rs index f9dde441..7447744f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,7 +27,7 @@ use tokio_codec; use hyper::http::request::Parts; use hyper::{Method, Body, Request, Response, Server, StatusCode}; use hyper::rt::{Future, Stream}; -//use hyper::service::service_fn; +use hyper::service::service_fn; use hyper::header; //use std::time::{Duration, Instant}; @@ -214,7 +214,7 @@ fn handle_static_file_download(filename: PathBuf) -> BoxFut { return Box::new(response); } -fn handle_request(req: Request) -> BoxFut { +fn handle_request(api: &ApiServer, req: Request) -> BoxFut { let (parts, body) = req.into_parts(); @@ -252,7 +252,7 @@ fn handle_request(req: Request) -> BoxFut { http_error_future!(BAD_REQUEST, format!("Unsupported output format '{}'.", format)) } - if let Some(info) = ROUTER.find_method(&components[2..]) { + if let Some(info) = api.router.find_method(&components[2..]) { println!("FOUND INFO"); let api_method_opt = match method { Method::GET => &info.get, @@ -279,7 +279,7 @@ fn handle_request(req: Request) -> BoxFut { let mut filename = PathBuf::from("/var/www"); // fixme if comp_len >= 1 { prefix.push_str(components[0]); - if let Some(subdir) = DIR_ALIASES.get(&prefix) { + if let Some(subdir) = api.aliases.get(&prefix) { filename.push(subdir); for i in 1..comp_len { filename.push(components[i]) } } @@ -318,39 +318,8 @@ fn initialize_directory_aliases() -> HashMap { struct ApiServer { basedir: PathBuf, -} - -impl hyper::service::Service for ApiServer { - type ReqBody = Body; - type ResBody = Body; - type Error = String; - type Future = Box, Error = String> + Send>; - - fn call(&mut self, req: Request) -> Self::Future { - - Box::new(handle_request(req).then(|result| { - match result { - Ok(res) => Ok(res), - Err(err) => { - if let Some(apierr) = err.downcast_ref::() { - let mut resp = Response::new(Body::from(apierr.message.clone())); - *resp.status_mut() = apierr.code; - Ok(resp) - } else { - Ok(error_response!(BAD_REQUEST, err.to_string())) - } - } - } - })) - } -} - -lazy_static!{ - static ref DIR_ALIASES: HashMap = initialize_directory_aliases(); -} - -lazy_static!{ - static ref ROUTER: MethodInfo = apitest::api3::router(); + router: &'static MethodInfo, + aliases: &'static HashMap, } fn main() { @@ -359,8 +328,34 @@ fn main() { let addr = ([127, 0, 0, 1], 8007).into(); let new_svc = || { - let service = ApiServer { basedir: "/var/www".into() }; - future::ok::<_,String>(service) + service_fn(|req| { + + lazy_static!{ + static ref ALIASES: HashMap = initialize_directory_aliases(); + static ref ROUTER: MethodInfo = apitest::api3::router(); + } + + let api_server = ApiServer { + basedir: "/var/www". into(), + router: &ROUTER, + aliases: &ALIASES, + }; + + handle_request(&api_server, req).then(|result| { + match result { + Ok(res) => Ok::<_,String>(res), + Err(err) => { + if let Some(apierr) = err.downcast_ref::() { + let mut resp = Response::new(Body::from(apierr.message.clone())); + *resp.status_mut() = apierr.code; + Ok(resp) + } else { + Ok(error_response!(BAD_REQUEST, err.to_string())) + } + } + } + }) + }) }; let server = Server::bind(&addr)