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
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use std::fmt;
use std::fs::File;
use std::io;
use std::net;
use std::path::Path;

use typemap;

use server::method;
use server::header;
use super::request;
use super::super::errors;
use backend::{Request, Url, AsUrl, WrapUrl};

#[allow(dead_code)]
pub struct SimpleRequest {
    pub url: Url,
    pub ext: typemap::TypeMap,
    pub remote_addr: net::SocketAddr,
    pub headers: header::Headers,
    pub method: method::Method,
    pub body: Box<io::Read + 'static>
}

impl<'a> Request for SimpleRequest {

    fn url(&self) -> &AsUrl {
        return &self.url;
    }

    fn remote_addr(&self) -> &net::SocketAddr {
        return &self.remote_addr;
    }

    fn headers(&self) -> &header::Headers {
        return &self.headers;
    }

    fn method(&self) -> &method::Method {
        return &self.method;
    }

    fn body(&self) -> &request::Body {
        return &self.body;
    }

    fn body_mut(&mut self) -> &mut request::Body {
        return &mut self.body;
    }

    fn read_to_end(&mut self) -> Result<Option<String>, Box<errors::Error + Send>> {
        let mut bytes = Vec::new();
        self.body.read_to_end(&mut bytes).unwrap();
        String::from_utf8(bytes)
            .map(|body| Some(body))
            .map_err(|err| Box::new(err) as Box<errors::Error + Send>)
    }
}

#[allow(dead_code)]
impl SimpleRequest {

    pub fn new(method: method::Method, url: ::url::Url) -> SimpleRequest {
        SimpleRequest {
            url: url.wrap_url(),
            method: method,
            ext: typemap::TypeMap::new(),
            remote_addr: "127.0.0.1:8000".parse().unwrap(),
            headers: header::Headers::new(),
            body: Box::new(io::Cursor::new(vec![]))
        }
    }

    pub fn build<F>(method: method::Method, url: ::url::Url, builder: F) -> SimpleRequest
    where F: Fn(&mut SimpleRequest) {
        let mut srq = SimpleRequest::new(method, url);
        builder(&mut srq);

        srq
    }

    pub fn set_remote_addr(&mut self, addr: net::SocketAddr) {
        self.remote_addr = addr;
    }

    pub fn set_remote_str(&mut self, addr: &str) {
        self.remote_addr = addr.parse().unwrap();
    }

    pub fn headers_mut(&mut self) -> &mut header::Headers {
        return &mut self.headers;
    }

    pub fn push_string(&mut self, body: String) {
        self.body = Box::new(io::Cursor::new(body.into_bytes()));
    }

    pub fn push_file(&mut self, path: &Path) -> io::Result<()> {
        self.body = Box::new(try!(File::open(path)));

        Ok(())
    }

}

impl_extensible!(SimpleRequest);

impl fmt::Debug for SimpleRequest {
    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
        try!(writeln!(f, "SimpleRequest ->"));
        try!(writeln!(f, "  url: {}", self.url));
        try!(writeln!(f, "  method: {}", self.method()));
        try!(writeln!(f, "  path: {:?}", self.url.path()));
        try!(writeln!(f, "  query: {:?}", self.url.query()));
        try!(writeln!(f, "  remote_addr: {}", self.remote_addr()));
        Ok(())
    }
}