sapper/
request.rs

1use std::net::SocketAddr;
2use std::io::Read;
3
4use hyper::server::request::Request as HyperRequest;
5use hyper::method::Method;
6use hyper::version::HttpVersion;
7use hyper::header::Headers;
8use hyper::uri::RequestUri;
9use typemap::TypeMap;
10
11/// Sapper request struct
12pub struct SapperRequest<'a, 'b: 'a> {
13    raw_req: Box<HyperRequest<'a, 'b>>,
14    ext: TypeMap
15} 
16
17impl<'a, 'b: 'a> SapperRequest<'a, 'b> {
18    /// constructor
19    pub fn new(req: Box<HyperRequest<'a, 'b>>) -> SapperRequest<'a, 'b> {
20        SapperRequest {
21            raw_req: req,
22            ext: TypeMap::new()
23        }
24    }
25    
26    /// get remote ip address
27    pub fn remote_addr(&self) -> SocketAddr {
28        self.raw_req.remote_addr
29    }
30    
31    /// get http method
32    pub fn method(&self) -> &Method {
33        &self.raw_req.method
34    }
35    
36    /// get http version
37    pub fn version(&self) -> HttpVersion {
38        self.raw_req.version
39    }
40    
41    /// get http headers referrence
42    pub fn headers(&self) -> &Headers {
43        &self.raw_req.headers
44    }
45    
46    /// get request path, and query parts
47    // TODO: optimize to (&str, Option<&str>)
48    // uri() -> (path, query)
49    pub fn uri(&self) -> (String, Option<String>) {
50        match self.raw_req.uri {
51            RequestUri::AbsolutePath(ref uri) => {
52                
53                let pathvec: Vec<&str> = uri[..].split('?').collect();
54                let path = pathvec[0].to_owned();
55                let mut query = None;
56
57                // if has query_string
58                if pathvec.len() > 1 {
59                    query = Some(pathvec[1].to_owned());
60                }
61                
62                (path, query)
63            },
64            //_ => unreachable!()
65            _ => {
66                ("".to_owned(), None)
67            }
68        }
69    }
70    
71    /// get the raw body vec of this request
72    // here, we read it all for simplify upload biz
73    pub fn body(&mut self) -> Option<Vec<u8>> {
74        let mut body_vec: Vec<u8> = vec![];
75        match self.raw_req.read_to_end(&mut body_vec) {
76            Ok(n) => {
77                if n > 0 {
78                    Some(body_vec)
79                }
80                else {
81                    None
82                }
83            },
84            Err(_) => {
85                println!("request body reading error!");
86                None
87            }
88        }
89    }
90    
91    /// get request struct ext ref
92    pub fn ext(&self) -> &TypeMap {
93        &self.ext
94    }
95    
96    /// get request struct ext mut ref
97    pub fn ext_mut(&mut self) -> &mut TypeMap {
98        &mut self.ext
99    }
100}
101