TODO

Step 6 少量代码重构

目前 if 和 else 块中的代码有很多的重复, 基于 DRY 原则 (Don't repeat yourself), 我们重构一下。

重构 handle_connection 函数



查看提示

重构 handle_connection 函数,将 if else 里面返回的状态行和文件名提取成两个语句,其它的相同语句只用写一遍就好了,完成重构。(可重用的语句有 let contents, let response, stream.write, stream.flush)

浏览页面 http://127.0.0.1:7878/http://127.0.0.1:7878/another_page ,确保看到正确的 Hello 和 404 页面。



Step 6 answer
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 (status_line, filename) = if buffer.starts_with(get) {
        ("HTTP/1.1 200 OK\r\n\r\n", "hello.html")
    } else {
        ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html")
    };

    let contents = fs::read_to_string(filename).unwrap();

    let response = format!("{}{}", status_line, contents); // 对比前面的代码发现这里省略了 contents.len()

    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}



到这里 The Book 20.1. 单线程 web server 就完成了。