Skip to content
Published at:

构建单线程 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();
}