| @@ -1,5 +1,56 @@ | |||
| # This file is automatically @generated by Cargo. | |||
| # It is not intended for manual editing. | |||
| [[package]] | |||
| name = "aho-corasick" | |||
| version = "0.7.10" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" | |||
| dependencies = [ | |||
| "memchr", | |||
| ] | |||
| [[package]] | |||
| name = "hello" | |||
| version = "0.1.0" | |||
| version = "0.2.0" | |||
| dependencies = [ | |||
| "regex", | |||
| ] | |||
| [[package]] | |||
| name = "lazy_static" | |||
| version = "1.4.0" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" | |||
| [[package]] | |||
| name = "memchr" | |||
| version = "2.3.3" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" | |||
| [[package]] | |||
| name = "regex" | |||
| version = "1.3.4" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" | |||
| dependencies = [ | |||
| "aho-corasick", | |||
| "memchr", | |||
| "regex-syntax", | |||
| "thread_local", | |||
| ] | |||
| [[package]] | |||
| name = "regex-syntax" | |||
| version = "0.6.16" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "1132f845907680735a84409c3bebc64d1364a5683ffbce899550cd09d5eaefc1" | |||
| [[package]] | |||
| name = "thread_local" | |||
| version = "1.0.1" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" | |||
| dependencies = [ | |||
| "lazy_static", | |||
| ] | |||
| @@ -1,9 +1,10 @@ | |||
| [package] | |||
| name = "hello" | |||
| version = "0.1.0" | |||
| version = "0.2.0" | |||
| authors = ["noelle"] | |||
| edition = "2018" | |||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | |||
| [dependencies] | |||
| regex = "1" | |||
| @@ -0,0 +1,11 @@ | |||
| <!doctype html> | |||
| <html lang="en"> | |||
| <head> | |||
| <meta charset="utf-8"> | |||
| <title>Hello!</title> | |||
| </head> | |||
| <body> | |||
| <h1>Hello!</h1> | |||
| <p>Hi from Rust</p> | |||
| </body> | |||
| </html> | |||
| @@ -1,11 +1,16 @@ | |||
| use std::net::{TcpStream, TcpListener}; | |||
| use std::io::prelude::*; | |||
| use std::fs; | |||
| use std::thread; | |||
| use std::time::Duration; | |||
| // 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); | |||
| @@ -24,14 +29,31 @@ fn handle_connection(mut stream: TcpStream) { | |||
| let mut buffer = [0; 512]; | |||
| stream.read(&mut buffer).unwrap(); | |||
| let get = b"GET / HTTP/1.1\r\n"; | |||
| let sleep = b"GET /sleep HTTP/1.1\r\n"; | |||
| 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 (status_line, filename) = if buffer.starts_with(get) { | |||
| ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") | |||
| } else if buffer.starts_with(sleep) { | |||
| thread::sleep(Duration::from_secs(5)); | |||
| ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") | |||
| 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") | |||
| }; | |||