Rust:TCP 流读取 POST 文件在 Edge 或 Chrome 浏览器中效果不佳

Rust: TCP Stream read POST file not works well in Edge or Chrome browsers

我有两个问题:我的 Rust 语言和我的英语语言 ;)

我用“use std::net::TcpListener; use std::net::TcpStream;”修改了一个迷你服务器来自 Rust Book 示例 (https://doc.rust-lang.org/book/ch20-03-graceful-shutdown-and-cleanup.html) 这段代码在 Firefox 浏览器常见的“表单”中完美运行,发送一个“输入类型='file'”,显然是“'enctype='multipart/form-data'”:

    let mut datax = Vec::new();
    let mut el_buffer = [0; 1024];
    let mut limita = 0;

    loop {
        let n = stream.read(&mut el_buffer).unwrap();
        if n<1024 {
            datax.extend_from_slice(&el_buffer[..n]);
            break;
        } else {
            datax.extend_from_slice(&el_buffer[..n]);
        }

        if limita >10000 {
            break;
        }
        limita += 1;
    }

我尝试使用:read_to_end(); read_exact(); BufReader::new(&流);让 mut el_buffer = [0; 1024]; // 1、512、4092、10240、102400、2000 等
我尝试使用“n==0 ... break”
我尝试在没有“循环”的情况下阅读...

结果是一样的:从 Firefox 读取所有文件并且工作正常但是从 Edge,Chrome,IE,切断收到的 POST 并且浏览器失去服务器连接。

提前感谢您的宝贵帮助。

        if n<1024 {
            datax.extend_from_slice(&el_buffer[..n]);
            break;
        } else {

Read::read() return输入小于完整大小的数字 并不 表示已到达输入末尾。这可能意味着数据尚不可用(例如,浏览器尚未发送它)或者它可能是内核的任何突发奇想。

read() returns 时,您应该结束阅读循环。这是唯一指定为表示“文件结尾”的 return 值。

经过多次尝试和错误,谷歌搜索,尝试和错误,谷歌搜索...我找到了一个很好的解释,那就是“read()”函数不足以处理“流”中的字节,所以我找到了很好的工具称为“buf_redux”,它取代了标准工具“std::io::BufReader”。我是这样使用的:

在“Cargo.toml”中:

[dependencies]  
buf_redux = "0.8.4"

在“main.rs”

    use buf_redux::BufReader;

    // ....

    let mut datax = Vec::new();
    let mut el_buffer = [0; 4096];
    
    // A 10 MBytes aprox.:
    let mut lector = BufReader::with_capacity(10240000, &mut stream);

    loop {
        let n = lector.read(&mut el_buffer).unwrap();
        println!("Bytes : {:?}", n);
        if n<4096 {
            datax.extend_from_slice(&el_buffer[..n]);
            break;
        } else {
            datax.extend_from_slice(&el_buffer[..n]);
        }
    }

希望对大家有所帮助