构建单线程 web server
rust
use std::io::prelude::*;
use std::{net::TcpListener, thread, time::Duration};
fn main() {
let listener = TcpListener::bind("127.0.0.1:8989").unwrap();
println!("bind success");
for stream in listener.incoming() {
let stream = stream.unwrap();
handle_connection(stream);
}
}
fn handle_connection(mut stream: std::net::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, file_name) = if buffer.starts_with(get) {
println!("get");
("HTTP/1.1 200 OK\r\n\r\n", "hello.html")
} else if buffer.starts_with(sleep) {
println!("sleep");
thread::sleep(Duration::from_secs(3));
("HTTP/1.1 200 OK\r\n\r\n", "hello.html")
} else {
println!("not found");
("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html")
};
// response
let content = std::fs::read_to_string(file_name).unwrap();
let response = format!("{}{}", status_line, content);
// write to client
stream.write(response.as_bytes()).unwrap();
stream.flush().unwrap();
}