TODO

Step 5 验证请求并有选择的进行响应

只是为了学习知识,这里我们对于根页面请求就返回 hello.html, 其它请求一律返回 404 页面。

在项目根目录 (即 Cargo.toml 所在目录) 创建一个新文件,404.html,内容如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>404 NOT FOUND</title>
    </head>
    <body>
        <h1>Oops!</h1>
        <p>Sorry, I don't know what you're asking for.</p>
    </body>
</html>

修改 handle_connection 来对 GET / HTTP/1.1 和其它请求返回不同的页面。



查看提示 1

修改 handle_connection() 函数,如果请求是以 "GET / HTTP/1.1\r\n" 开头就返回 HTTP/1.1 200 OK 状态行及头部及 hello.html 页面。

浏览页面 http://127.0.0.1:7878/ ,这时前台会看到 Hello 页面。



Step 5 answer 1
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";

    if buffer.starts_with(get) {
        let contents = fs::read_to_string("hello.html").unwrap();

        let response = format!(
            "HTTP/1.1 200 OK\r\nContent-Lenth: {}\r\n\r\n{}",
            contents.len(),
            contents
        );

        stream.write(response.as_bytes()).unwrap();
        stream.flush().unwrap();
    } else {
        todo!();  // 请看 小步骤 2
    }
}


查看提示 2

否则,返回 HTTP/1.1 404 NOT FOUND 状态行及头部及 4.4.html 页面。

浏览页面 http://127.0.0.1:7878/another_page ,这时前台会看到 404 页面。



Step 5 answer 2
// --snip--

} else {
    let status_line = "HTTP/1.1 404 NOT FOUND\r\n\r\n";
    let contents = fs::read_to_string("404.html").unwrap();

    let response = format!("{}{}", status_line, contents);

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