| 1 | 1 | extern crate hyper; | 
|  | 2 |  | 
|  | 3 | mod error; | 
|  | 4 | mod helper; | 
|  | 5 | mod matching; | 
| 2 | 6 |  | 
| 3 | 7 | use hyper::Server; | 
| 4 | 8 | use hyper::server::{Handler,Request,Response}; | 
| 5 | 9 | use hyper::net::Fresh; | 
| 6 | 10 |  | 
| 7 | 11 | use std::env::{args,current_dir,set_current_dir}; | 
| 8 |  | use std::fs::{File,read_dir}; | 
| 9 |  | use std::io::prelude::Read; | 
|  | 12 | use std::fs::{read_dir}; | 
| 10 | 13 | use std::iter::Iterator; | 
| 11 | 14 | use std::path::Path; | 
| 12 | 15 |  | 
| 13 |  | mod matching; | 
| 14 |  |  | 
| 15 |  | #[derive(Debug)] | 
| 16 |  | enum AloysError { | 
| 17 |  | IOError(std::io::Error), | 
| 18 |  | HyperError(hyper::error::Error), | 
| 19 |  | } | 
| 20 |  |  | 
| 21 |  | impl From<std::io::Error> for AloysError { | 
| 22 |  | fn from(e: std::io::Error) -> AloysError { | 
| 23 |  | AloysError::IOError(e) | 
| 24 |  | } | 
| 25 |  | } | 
| 26 |  |  | 
| 27 |  | impl From<hyper::error::Error> for AloysError { | 
| 28 |  | fn from(e: hyper::error::Error) -> AloysError { | 
| 29 |  | AloysError::HyperError(e) | 
| 30 |  | } | 
| 31 |  | } | 
|  | 16 | use error::{AloysError,aloys_error}; | 
|  | 17 | use helper::with_file_contents; | 
| 32 | 18 |  | 
| 33 | 19 | #[derive(Debug, Clone)] | 
| 34 | 20 | enum Delegate { | 
            
              
                |  | 
            
          | 54 | 40 | routes: Vec<RouteSpec>, | 
| 55 | 41 | } | 
| 56 | 42 |  | 
| 57 |  | fn with_file_contents<A, F>(path: &Path, default: A, callback: F) -> A | 
| 58 |  | where F: FnOnce(String) -> A + 'static { | 
| 59 |  | match File::open(path) { | 
| 60 |  | Ok(mut f)  => { | 
| 61 |  | let mut s = String::new(); | 
| 62 |  | match f.read_to_string(&mut s) { | 
| 63 |  | Ok(_) => callback(s), | 
| 64 |  | Err(_) => default, | 
| 65 |  | } | 
| 66 |  | }, | 
| 67 |  | Err(_) => default, | 
| 68 |  | } | 
| 69 |  | } | 
| 70 |  |  | 
| 71 |  | impl RouteSpec { | 
| 72 |  | fn from_path(dir: &Path) -> Result<RouteSpec,AloysError> { | 
| 73 |  | let path   = with_file_contents(&dir.join("path"), None, |s| Some(s)); | 
| 74 |  | let domain = with_file_contents(&dir.join("domain"), None, |s| Some(s)); | 
| 75 |  | let mode   = with_file_contents(&dir.join("mode"), "http", |s| s); | 
| 76 |  | if mode == "http" { | 
| 77 |  | } else if mode == "alyos" { | 
| 78 |  | let fwd = with_file_contents(&dir.join("conf"), | 
| 79 |  | Path::new(&"/dev/null"), | 
| 80 |  | |s| Path::new(&s)); | 
| 81 |  | let rts = try!(Routes::load_paths(fwd)); | 
| 82 |  | Ok(RouteSpec { for_path: path, | 
| 83 |  | for_domain: domain, | 
| 84 |  | delegate_to: Delegate:: | 
| 85 |  | } else { | 
| 86 |  |  | 
| 87 |  | } | 
| 88 |  | // let forPath = match File::open(dir.join("path")) { | 
| 89 |  | //     Ok(f) => {}; | 
| 90 |  | //     Err | 
| 91 |  | // }; | 
| 92 |  | Ok(RouteSpec { for_path: None, | 
| 93 |  | for_domain: None, | 
| 94 |  | delegate_to: Delegate::Defer(Routes { routes: vec![] }), | 
| 95 |  | }) | 
| 96 |  | } | 
| 97 |  | } | 
| 98 |  |  | 
| 99 | 43 | impl Routes { | 
| 100 | 44 | fn load_paths(dir: &Path) -> Result<Routes,AloysError> { | 
| 101 | 45 | let mut routes = vec![]; | 
            
              
                |  | 
            
          | 117 | 61 |  | 
| 118 | 62 | fn find_delegate(&self, req: &Request) -> Option<&Delegate> { | 
| 119 | 63 | for d in self.routes.iter() { | 
|  | 64 | let mut matches = true; | 
| 120 | 65 | if let Some(ref d) = d.for_domain { | 
| 121 | 66 | println!("Matching against {:?}", d); | 
| 122 | 67 | } | 
            
              
                |  | 
            
          | 132 | 77 | impl Handler for Routes { | 
| 133 | 78 | fn handle(&self, req: Request, res: Response<Fresh>) { | 
| 134 | 79 | self.dispatch(&req, res); | 
|  | 80 | } | 
|  | 81 | } | 
|  | 82 |  | 
|  | 83 | impl RouteSpec { | 
|  | 84 | fn from_path(dir: &Path) -> Result<RouteSpec,AloysError> { | 
|  | 85 | let path   = with_file_contents(&dir.join("path"), None, |s| Some(s)); | 
|  | 86 | let domain = with_file_contents(&dir.join("domain"), None, |s| Some(s)); | 
|  | 87 | let mode   = with_file_contents(&dir.join("mode"), "http".to_string(), |s| s); | 
|  | 88 | if mode == "http" { | 
|  | 89 | aloys_error("Unimplemented".to_string()) | 
|  | 90 | } else if mode == "alyos" { | 
|  | 91 | let fwd = with_file_contents(&dir.join("conf"), | 
|  | 92 | "/dev/null".to_string(), | 
|  | 93 | |s| s); | 
|  | 94 | let rts = try!(Routes::load_paths(Path::new(&fwd))); | 
|  | 95 | Ok(RouteSpec { for_path: path, | 
|  | 96 | for_domain: domain, | 
|  | 97 | delegate_to: Delegate::Defer(rts) }) | 
|  | 98 | } else { | 
|  | 99 | aloys_error(format!("Unknown mode `{:?}` in `{:?}", mode, dir)) | 
|  | 100 | } | 
| 135 | 101 | } | 
| 136 | 102 | } | 
| 137 | 103 |  |