如何知道服务器何时收到整个请求?

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 规范).