如何知道服务器何时收到整个请求?
How to know when the server has received the whole request?
出于学术目的,我正在从头开始实施 HTTP/1.1 协议。我已经实现了 RequestBuilder
,它从传递的缓冲区中连续构建请求对象。这是处理打开的套接字的代码。
async fn process_socket(stream: TcpStream) -> Result<Request> {
let mut request_builder = RequestBuilder::new();
let mut buffer: [u8; 1024] = unsafe { MaybeUninit::uninit().assume_init() };
loop {
stream.readable().await?;
match stream.try_read(&mut buffer) {
Ok(0) => {
break;
}
Ok(n) => (),
Err(ref e) if e.kind() == ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
request_builder.parse(&buffer);
}
let request = request_builder.build()?;
Ok(request)
}
request_builder.parse(&buffer);
将获取缓冲区的下一部分并进一步解析请求。我的问题是,当客户端发送了整个请求时如何打破循环。当我使用 curl localhost:8080
向服务器发出请求时,整个请求都会被解析。
预期行为
循环会在读取整个请求流后中断。
实际行为
将整个请求读入缓冲区后,循环停滞在 stream.readable().await?;
。目前,当我使用 Ctrl+C
终止 curl
命令时,循环使用 Ok(0)
中断,但我希望它在读取 who
后中断
您需要解释 HTTP 请求,因为 TCP 连接不会被客户端半关闭。客户端的 FIN
会违反协议)是唯一的方式 readable()
returns(带有 Err
)除非客户端发送更多数据(这会破坏 HTTP 规范).
出于学术目的,我正在从头开始实施 HTTP/1.1 协议。我已经实现了 RequestBuilder
,它从传递的缓冲区中连续构建请求对象。这是处理打开的套接字的代码。
async fn process_socket(stream: TcpStream) -> Result<Request> {
let mut request_builder = RequestBuilder::new();
let mut buffer: [u8; 1024] = unsafe { MaybeUninit::uninit().assume_init() };
loop {
stream.readable().await?;
match stream.try_read(&mut buffer) {
Ok(0) => {
break;
}
Ok(n) => (),
Err(ref e) if e.kind() == ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
request_builder.parse(&buffer);
}
let request = request_builder.build()?;
Ok(request)
}
request_builder.parse(&buffer);
将获取缓冲区的下一部分并进一步解析请求。我的问题是,当客户端发送了整个请求时如何打破循环。当我使用 curl localhost:8080
向服务器发出请求时,整个请求都会被解析。
预期行为
循环会在读取整个请求流后中断。
实际行为
将整个请求读入缓冲区后,循环停滞在 stream.readable().await?;
。目前,当我使用 Ctrl+C
终止 curl
命令时,循环使用 Ok(0)
中断,但我希望它在读取 who
您需要解释 HTTP 请求,因为 TCP 连接不会被客户端半关闭。客户端的 FIN
会违反协议)是唯一的方式 readable()
returns(带有 Err
)除非客户端发送更多数据(这会破坏 HTTP 规范).