37 lines
584 B
Go
37 lines
584 B
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net"
|
|
)
|
|
|
|
type HTTPStatusError struct {
|
|
StatusCode int
|
|
Status string
|
|
}
|
|
|
|
func (e *HTTPStatusError) Error() string {
|
|
return "remote status " + e.Status
|
|
}
|
|
|
|
func IsRetriable(err error) bool {
|
|
if err == nil {
|
|
return false
|
|
}
|
|
var statusErr *HTTPStatusError
|
|
if errors.As(err, &statusErr) {
|
|
switch statusErr.StatusCode {
|
|
case 404, 408, 429, 500, 502, 503, 504:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
if errors.Is(err, context.DeadlineExceeded) {
|
|
return true
|
|
}
|
|
var netErr net.Error
|
|
return errors.As(err, &netErr)
|
|
}
|