1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
extern crate iron;

use std::collections::HashMap;
use iron::{Handler, IronResult, Request, Response};

pub struct Vhosts {
    default: Box<Handler>,
    vhosts: HashMap<String, Box<Handler>>,
}

impl Vhosts {

    pub fn new<H: Handler>(h: H) -> Vhosts {
        Vhosts {
            default: Box::new(h) as Box<Handler>,
            vhosts: HashMap::new()
        }
    }

    /// For adding a handler for a host
    ///
    /// # Examples
    ///
    /// ```rust,no_run
    /// extern crate iron;
    /// extern crate iron_vhosts;
    ///
    /// use iron::prelude::*;
    /// use iron::status;
    /// use iron_vhosts::Vhosts;
    ///
    /// fn main () {
    ///     //Default handler passed to new
    ///     let mut vhosts = Vhosts::new(|_: &mut Request| Ok(Response::with((status::Ok, "vhost"))));
    ///
    ///     //Add any host specific handlers
    ///     vhosts.add_host("localhost", localhost_handler);
    ///     vhosts.add_host("media.localhost", media_handler);
    ///   
    ///     fn localhost_handler(_: &mut Request) -> IronResult<Response> {
    ///         Ok(Response::with((status::Ok, "localhost")))
    ///     }
    ///
    ///     fn media_handler(_: &mut Request) -> IronResult<Response> {
    ///         Ok(Response::with((status::Ok, "media")))
    ///     }
    ///
    ///     Iron::new(vhosts).http("localhost:3000").unwrap();
    /// }
    /// ```
    pub fn add_host<H: Handler, I:Into<String> >(&mut self, host: I, h: H) -> Option<Box<Handler>> {
        self.vhosts.insert(host.into(), Box::new(h))
    }

}

impl Handler for Vhosts {
    fn handle(&self, req: &mut Request) -> IronResult<Response> {
        //get the host from the request
        let host = {
            let host = req.url.host();
            format!("{}", host)
        };

        //get the handler associated to the host
        let handler = match self.vhosts.get(host.as_str()){
            Some(box_handler) => box_handler,
            None              => &self.default
        };
        
        //fire off the handler
        handler.handle(req)
    }
}


#[test]
fn it_works() {
}