firefox - 为什么 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
# ...
环境
- macOS Catalina 10.15.5
- 火狐 77.0.1
- 锈 1.14.1
- 私人浏览
答案不应该是解决方案。我只是想知道区别。
解决方案
推荐阅读
- java - 在 Apache Jmeter 中执行基于 Java 的 Selenium WebDriver 测试
- wireshark - tcpreplay:以相反的顺序重播 pcap
- sql - 如何在 Presto 中获取连续日期,其中一列中的开始日期和另一列中的结束日期
- javascript - t.find(...).val(...).toFixed 不是函数
- c++ - 特征模板函数正确声明
- javascript - 使用浏览器javascript,如何获取用户指定本地目录的文件和子文件夹的内容
- android - Android x PreferenceFragmentCompat 重叠 androidx.fragment.app.Fragment
- github - Github 全局默认问题模板不起作用
- python - 如何在存储过程中使用 python 传递对象类型作为 IN OUT 参数
- node.js - 包含在包含在续集中