感谢对仓颉社区的支持与关注,欢迎反馈缺陷。
HTTP 1.1 客户端 ConnNode.sendRequestTimeout 中,读取响应逻辑与发送 body 协程未正确同步。当请求失败触发重试时,重试使用的同一个 request 对象可能被并发访问 HttpBufferedBody,导致数据竞争。
ConnNode.sendRequestTimeout
HttpBufferedBody
发送 body 协程的异常仅捕获 SocketException,其他异常类型(如 HttpException)未被捕获,可能导致未处理异常传播。
SocketException
HttpException
writeTimer 在正常路径中被取消,但在异常路径中未被取消,可能导致定时器泄漏。
writeTimer
Exception
使用 HTTP 1.1 客户端发送带 body 的请求,模拟网络中断或服务端提前关闭连接的场景,触发重试机制,观察是否出现并发访问异常。
涉及文件:src/stdx/net/http/http_client1_1.cj(ConnNode.sendRequestTimeout 方法)
src/stdx/net/http/http_client1_1.cj
仓颉 SDK 1.3.0-alpha.01
1.3.0-alpha.20260825091342
感谢对仓颉社区的支持与关注,欢迎反馈缺陷。
发生了什么问题? | Describe the issue that occurred.
HTTP 1.1 客户端
ConnNode.sendRequestTimeout中,读取响应逻辑与发送 body 协程未正确同步。当请求失败触发重试时,重试使用的同一个 request 对象可能被并发访问HttpBufferedBody,导致数据竞争。发送 body 协程的异常仅捕获
SocketException,其他异常类型(如HttpException)未被捕获,可能导致未处理异常传播。writeTimer在正常路径中被取消,但在异常路径中未被取消,可能导致定时器泄漏。期望行为是什么? | What is the expected behavior?
Exception类型而非仅SocketException。writeTimer在 finally 中取消,确保异常路径也能清理。如何复现该缺陷 | How to reproduce the bug
使用 HTTP 1.1 客户端发送带 body 的请求,模拟网络中断或服务端提前关闭连接的场景,触发重试机制,观察是否出现并发访问异常。
其他补充信息 | Additional information
涉及文件:
src/stdx/net/http/http_client1_1.cj(ConnNode.sendRequestTimeout 方法)cjc版本信息 | cjc version information
仓颉 SDK 1.3.0-alpha.01
stdx版本信息 | stdx version information
1.3.0-alpha.20260825091342
分支版本信息 | Branch version information