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
相关产品推荐
相关产品推荐

