| # This file is automatically @generated by Cargo. | # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | # 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]] | [[package]] | ||||
| name = "hello" | 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", | |||||
| ] |
| [package] | [package] | ||||
| name = "hello" | name = "hello" | ||||
| version = "0.1.0" | |||||
| version = "0.2.0" | |||||
| authors = ["noelle"] | authors = ["noelle"] | ||||
| edition = "2018" | edition = "2018" | ||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
| [dependencies] | [dependencies] | ||||
| regex = "1" |
| <!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> |
| use std::net::{TcpStream, TcpListener}; | use std::net::{TcpStream, TcpListener}; | ||||
| use std::io::prelude::*; | use std::io::prelude::*; | ||||
| use std::fs; | 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; | use hello::ThreadPool; | ||||
| extern crate regex; | |||||
| use regex::Regex; | |||||
| fn main() { | fn main() { | ||||
| let listener = TcpListener::bind("127.0.0.1:26382").unwrap(); | let listener = TcpListener::bind("127.0.0.1:26382").unwrap(); | ||||
| let pool = ThreadPool::new(4); | let pool = ThreadPool::new(4); | ||||
| let mut buffer = [0; 512]; | let mut buffer = [0; 512]; | ||||
| stream.read(&mut buffer).unwrap(); | 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 { | } else { | ||||
| ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") | ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") | ||||
| }; | }; |