-
Notifications
You must be signed in to change notification settings - Fork 115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如果只获取Response(), 当WithContext在SetTimeout前面时,会导致context cancel错误 #383
Comments
原因目前设计是这样的,SetTimeout和WithContext的使用只会有一个生效。后面一个覆盖前面一个。 func (s *Setting) SetTimeout(d time.Duration) {
s.Index++
s.TimeoutIndex = s.Index
s.Timeout = d
} 解决办法-优化提示消息
老版本的context.Context实现有个问题,不能使用自定义的错误类型。所以这里的错误有些不友好。 这块我今天或者明天优化下,如果是Timeout的错误就显示"Timeout“, 唯一的遗憾只能 > 1.20的版本这么实现 |
其实传递WithContext(ctx)的原因主要还是外侧代码需要控制goout内部的中断 比如是一个并发任务的控制端
除了这种场景,还有很多需要外侧控制ctx的场景,比如http.Server中用户主动关闭连接,或者外界代码有timeout的控制要求等 所以SetTimeout后,也应该包裹该ctx才行,比如 在SSE中,需要自行读取Response.Body的内容,建议Wrap下Response.Body,并在Close中封装Reset的相关实现 因为 |
是的,我也打算换成包裹外层的ctx。更合理些。
这块我初始的想法是提供一个Callback函数,形参是[]byte,像下面这样,提供sse的功能封装。 func OnSSEData(b []byte) {
} |
ok,我研究下。 |
Bug Report
在SSE等流式响应模式中(返回时间很长),需要获取Response
如下代码,会报错
当
WithContext(ctx)
在SetTimeout
上面时,读取Response.Body(一段时间后)会出现context cancel
的异常产生BUG原因:
因为r.cancel被调用,r.c会直接退出
解决办法
将setTimeout放在withContext上面
The text was updated successfully, but these errors were encountered: