-use std::fs;
-use std::io::prelude::*;
-use std::net::TcpListener;
-use std::net::TcpStream;
-use std::thread;
-use std::time::Duration;
+use std::{
+ fs,
+ io::{prelude::*, BufReader},
+ net::{TcpListener, TcpStream},
+ thread,
+ time::Duration,
+};
// ANCHOR: here
fn main() {
// ANCHOR_END: here
fn handle_connection(mut stream: TcpStream) {
- let mut buffer = [0; 1024];
- 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 (status_line, filename) = if buffer.starts_with(get) {
- ("HTTP/1.1 200 OK", "hello.html")
- } else if buffer.starts_with(sleep) {
- thread::sleep(Duration::from_secs(5));
- ("HTTP/1.1 200 OK", "hello.html")
- } else {
- ("HTTP/1.1 404 NOT FOUND", "404.html")
+ let buf_reader = BufReader::new(&mut stream);
+ let request_line = buf_reader.lines().next().unwrap().unwrap();
+
+ let (status_line, filename) = match &request_line[..] {
+ "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
+ "GET /sleep HTTP/1.1" => {
+ thread::sleep(Duration::from_secs(5));
+ ("HTTP/1.1 200 OK", "hello.html")
+ }
+ _ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
};
let contents = fs::read_to_string(filename).unwrap();
+ let length = contents.len();
- let response = format!(
- "{}\r\nContent-Length: {}\r\n\r\n{}",
- status_line,
- contents.len(),
- contents
- );
+ let response =
+ format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
- stream.write(response.as_bytes()).unwrap();
- stream.flush().unwrap();
+ stream.write_all(response.as_bytes()).unwrap();
}