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 就完成了。