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 119 120 121 122
use std::collections::HashMap; use std::io::Write; use std::sync::{Arc, Mutex}; use server::Stream; pub use self::request::Request; pub use self::response::Response; pub use self::http_code::StatusCode; pub use self::http_method::Method; use self::http_date::HTTPDate; mod http_code; mod http_date; mod http_method; mod request; mod response; pub struct Http { stream: Arc<Mutex<Stream>>, } impl Http { pub fn new(stream: Arc<Mutex<Stream>>) -> Http { Http { stream: stream, } } pub fn decode(&mut self) -> Request { let mut stream = self.stream.lock().unwrap(); let line = read_next_line(&mut stream); let mut words = line.trim().split(' '); let method = words.next(); let path = words.next(); let version = words.next(); let method = method.unwrap(); let path = path.unwrap(); let version = version.unwrap(); let mut headers: HashMap<String, String> = HashMap::new(); loop { let line = read_next_line(&mut stream); if line.len() == 0 { break; } let mut header = line.trim().split(':'); let key = header.next(); let value = header.next(); let key = key.unwrap(); let value = value.unwrap().trim(); headers.insert(key.to_owned(), value.to_owned()); } let remote_addr = stream.remote_addr(); Request::new( method.parse().unwrap(), path.to_owned(), version.to_owned(), headers, remote_addr, stream.to_vec() ) } pub fn encode(&mut self, response: Response) { let mut stream = self.stream.lock().unwrap(); let mut data = Vec::new(); write!(data, "HTTP/1.1 {} {}\r\n", response.status_code.0, response.status_code.default_reason_phrase()).unwrap(); write!(data, "Data: {}\r\n", HTTPDate::new().to_string()).unwrap(); write!(data, "Server: Sincere\r\n").unwrap(); if let Some(data_length) = response.data_length { write!(data, "Content-Length: {}\r\n", data_length).unwrap(); } for (key, value) in response.headers { write!(data, "{}: {}\r\n", key, value).unwrap(); } write!(data, "\r\n").unwrap(); stream.write(&data).unwrap(); stream.write(&response.data).unwrap(); } } pub fn read_next_line(stream: &mut Stream) -> String { let mut buf = Vec::new(); let mut prev_byte_was_cr = false; let mut index: usize = 0; for i in 0.. { let byte = stream.get(i).unwrap(); if *byte == b'\n' && prev_byte_was_cr { buf.pop(); index = i; break; } prev_byte_was_cr = *byte == b'\r'; buf.push(*byte); } stream.split_off(index + 1); String::from_utf8(buf).unwrap() }