首页 > 解决方案 > 为什么 Firefox 对 Rust HTTP 服务器的请求会阻塞 TcpStream::read?

问题描述

在阅读The Rust Programming Language的第 20.1 章时,我遇到了一个奇怪的问题。

use std::io::prelude::*;
use std::net::TcpListener;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

    for stream in listener.incoming() {
        println!("-> 1");
        let mut stream = stream.unwrap();
        println!("-> 2");
        let mut buffer = [0; 1024];
        println!("-> 3");
        
        stream.read(&mut buffer).unwrap();
        println!("-> 4");
        let s = String::from_utf8_lossy(&buffer);
        println!("{}", s);

        let response = "HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=utf-8\r\n";

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

当我127.0.0.1:7878在 Firefox 地址栏中键入时,线程被阻塞了大约 5 秒。

刷新 Firefox 不会导致问题,我不知道有什么区别。我所知道的是问题发生在流读取阶段。

终端输出:

-> 1
-> 2
-> 3
# thread blocking
-> 4
# no buffer output

-> 1
-> 2
-> 3
# no blocking
-> 4
GET / HTTP/1.1
Host: 127.0.0.1:7878
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0
# ...

环境

答案不应该是解决方案。我只是想知道区别。

标签: firefoxrust

解决方案


推荐阅读