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]);
}
}
希望对大家有所帮助
我有两个问题:我的 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]);
}
}
希望对大家有所帮助