45 lines
767 B
Go
45 lines
767 B
Go
|
package httpclient
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"net/http"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
// DefaultRetryTimes 如果请求失败,最多重试3次
|
|||
|
DefaultRetryTimes = 3
|
|||
|
// DefaultRetryDelay 在重试前,延迟等待100毫秒
|
|||
|
DefaultRetryDelay = time.Millisecond * 100
|
|||
|
)
|
|||
|
|
|||
|
// Verify parse the body and verify that it is correct
|
|||
|
type RetryVerify func(body []byte) (shouldRetry bool)
|
|||
|
|
|||
|
func shouldRetry(ctx context.Context, httpCode int) bool {
|
|||
|
select {
|
|||
|
case <-ctx.Done():
|
|||
|
return false
|
|||
|
default:
|
|||
|
}
|
|||
|
|
|||
|
switch httpCode {
|
|||
|
case
|
|||
|
_StatusReadRespErr,
|
|||
|
_StatusDoReqErr,
|
|||
|
|
|||
|
http.StatusRequestTimeout,
|
|||
|
http.StatusLocked,
|
|||
|
http.StatusTooEarly,
|
|||
|
http.StatusTooManyRequests,
|
|||
|
|
|||
|
http.StatusServiceUnavailable,
|
|||
|
http.StatusGatewayTimeout:
|
|||
|
|
|||
|
return true
|
|||
|
|
|||
|
default:
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|