如何捕获“http:服务器关闭空闲连接”错误

Ela*_*Ela 4 httprequest go

在我的 go 应用程序中,我收到以下错误:“http:服务器关闭空闲连接”。如果遇到它,我想捕获它并重试我的 http 连接。

我发现这个错误来自“net/http”包,而且来自传输实现。特别是它在这里定义 我把它包裹起来,url.Error但这就是我所能找到的。你知道我如何才能真正捕捉到这个错误吗?

编辑:我正在使用弹性搜索客户端,而后者又使用net/http. 从客户端,我收到了上述错误,并希望将我的弹性搜索请求作为临时请求重试。现在,我捕捉瞬态错误的方式是:

if urlErr, ok := err.(*url.Error); ok && (urlErr.Temporary() || urlErr.Err == io.EOF) {
    return retryRequest()

}
Run Code Online (Sandbox Code Playgroud)

Gra*_*Fox 5

评论中net/http/transport.go这样说(位于此处):

if err == errServerClosedIdle {
    // The server replied with io.EOF while we were trying to
    // read the response. Probably an unfortunately keep-alive
    // timeout, just as the client was writing a request.
    return true
}
Run Code Online (Sandbox Code Playgroud)

如果 Go 发现一个非零值http.Request.GetBody(在这里找到),Go 将尝试重试该请求,所以我认为它应该重试该请求(或提供一个GetBody函数)。

至于主要的错误原因,您可能想要检查服务器的保持活动功能,我的猜测是服务器io.EOF过早地发送 TCP 连接重置(解释为)。您可能想尝试禁用 keep-alives 并查看是否有任何改变。