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
11pub 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 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 pub fn remote_addr(&self) -> SocketAddr {
28 self.raw_req.remote_addr
29 }
30
31 pub fn method(&self) -> &Method {
33 &self.raw_req.method
34 }
35
36 pub fn version(&self) -> HttpVersion {
38 self.raw_req.version
39 }
40
41 pub fn headers(&self) -> &Headers {
43 &self.raw_req.headers
44 }
45
46 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 pathvec.len() > 1 {
59 query = Some(pathvec[1].to_owned());
60 }
61
62 (path, query)
63 },
64 _ => {
66 ("".to_owned(), None)
67 }
68 }
69 }
70
71 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 pub fn ext(&self) -> &TypeMap {
93 &self.ext
94 }
95
96 pub fn ext_mut(&mut self) -> &mut TypeMap {
98 &mut self.ext
99 }
100}
101