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

时间:2021-04-27 12:26:37

标签: rust rust-tokio

出于学术目的,我正在从头开始实施 HTTP/1.1 协议。我已经实现了 app.set('views', path.join(__dirname, '../views')); app.set('view engine', 'ejs'); app.use(favicon(path.join(__dirname, '../public/visitele.ico'))); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false, limit: '50mb'})); app.use(cookieParser()); app.use(cors()); app.use(express.static(path.join(__dirname, '../public'))); app.use('/static', express.static(path.join(__dirname, '../static'))); ,它从传递的缓冲区中连续构建请求对象。这是处理打开的套接字的代码。

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?; 杀死 curl 命令时,使用 Ctrl+C 中断循环,但我希望它在阅读 who 后中断

1 个答案:

答案 0 :(得分:1)

您需要解释 HTTP 请求,因为 TCP 连接不会被客户端半关闭。除非客户端发送更多数据(这违反了 HTTP 规范),否则客户端的 FIN 会违反协议)是 readable() 返回(带有 Err)的唯一方式。

相关问题