use std::net::{TcpStream, TcpListener}; use std::io::prelude::*; use std::fs; // use std::thread; // use std::time::Duration; // use std::str; use std::path::Path; use hello::ThreadPool; extern crate regex; use regex::Regex; fn main() { let listener = TcpListener::bind("127.0.0.1:26382").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming() { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!("Shutting down."); } fn handle_connection(mut stream: TcpStream) { let mut buffer = [0; 512]; stream.read(&mut buffer).unwrap(); let hdr = Regex::new(r"GET /([^ ]*) HTTP/1.1").unwrap(); let bf = &String::from_utf8_lossy(&buffer[..]); // let get = b"GET / HTTP/1.1\r\n"; // let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(b"GET") { let caps = hdr.captures(bf); match caps { Some(cap) => { let c = cap.get(1).unwrap().as_str(); // println!("Asked to fetch {}", c); //assert!(Path::new(c).exists()); if c == "" { ("HTTP/1.1 200 OK\r\n\r\n", "index.html") } else if Path::new(c).exists() { ("HTTP/1.1 200 OK\r\n\r\n", c) } else { ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") } }, None => { ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") } } } else { ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); let response = format!("{}{}", status_line, contents); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); // println!("Request: {}", String::from_utf8_lossy(&buffer[..])); }