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

时间:2017-03-17 00:46:02

标签: go httprequest

在我的go应用程序中,我收到以下错误:" http:server closed idle connection"。如果遇到的话,我想抓住它并重试我的http连接。

我发现此错误来自" net / http"包装以及运输实施。特别是它定义了here 我把它包裹在url.Error中,但这是我能够找到的全部内容。你知道我怎么能真正发现这个错误吗?

编辑: 我正在使用elastic search client,而https://gleam.io/stuart-test正在使用net/http。从客户端我得到上面提到的错误,并想重新我的弹性搜索请求是暂时的。目前,我捕捉瞬态错误的方式是:

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

}

2 个答案:

答案 0 :(得分:1)

self.delegate.passSliderValue() 中的评论说明(位于here):

net/http/transport.go

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 } (找到here)时尝试重试该请求,因此我认为应该重试该请求(或提供http.Request.GetBody功能)。

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

答案 1 :(得分:1)

正如Gray Fox所说,Go通常会重试这些请求。但是,对于不是“幂等”的请求,情况并非如此。我在POST请求中遇到了一些此类错误,经过搜索后发现this Github issue上写着:

HTTP传输通常会重试这些请求,但是由于它们是POST请求,因此它们不是幂等的,并且Go保守地认为重试它们可能是不安全的。

此问题之后,有人提到许多银行API使用Idempotent-Key标头的某些变体来使其“安全”。 Stripe是使用该标头的公司,这就是their API docs这样说的:

API支持幂等性,可以安全地重试请求,而不会意外执行两次相同的操作。

那么您就可以使用标题了。

简而言之,如果您想让Go的HTTP传输重试POST请求(以及其他非幂等请求),则需要包含Idempotency-KeyX-Idempotency-Key标头。不一定使这些请求成为幂等,但从net/http的角度来看,这将使它们可重试。

链接: