You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust编写HTTP解析服务时TcpStream读取\r\n后挂起问题求助

问题根因
  • 逻辑缺失HTTP请求终止判断:HTTP请求结构为「请求行 + N个请求头 + 仅包含\r\n的空行」,GET请求没有请求体,读到该空行就应该结束请求读取流程。你的代码中对应空行退出的break逻辑被注释,导致循环持续执行,read_line会阻塞等待客户端发送新数据。
  • HTTP/1.1默认启用长连接(keep-alive),客户端发完请求后不会主动关闭连接,read_line始终不会返回0,程序就会一直挂起。只有手动断开客户端连接时,才会触发read_line返回0,执行后续的日志打印逻辑。
  • 你之前尝试read_to_string没有效果,是因为该方法会一直读到连接返回EOF才会结束,长连接场景下客户端不会主动关闭连接,所以同样会挂起。
修复方案

基础适配(仅支持GET请求)

直接恢复空行退出逻辑即可,建议使用更严谨的空行判断替换原有的: 存在性判断:
修改handle_connection函数中的对应代码:

if request_verb == GET && line.trim().is_empty() {
    // 读到请求头结束的空行,GET请求读取完成
    break;
}

进阶适配(支持带请求体的请求)

如果后续要支持POST等带请求体的方法,需要额外做如下处理:

  • 读取请求头时提取Content-Length字段的数值
  • 读到空行后,再读取Content-Length对应字节数的内容,再退出读取循环

内容的提问来源于stack exchange,提问作者tomdemuyt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:45:04