github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/putio/error.go (about) 1 package putio 2 3 import ( 4 "fmt" 5 "net/http" 6 7 "github.com/putdotio/go-putio/putio" 8 "github.com/rclone/rclone/fs/fserrors" 9 ) 10 11 func checkStatusCode(resp *http.Response, expected int) error { 12 if resp.StatusCode != expected { 13 return &statusCodeError{response: resp} 14 } 15 return nil 16 } 17 18 type statusCodeError struct { 19 response *http.Response 20 } 21 22 func (e *statusCodeError) Error() string { 23 return fmt.Sprintf("unexpected status code (%d) response while doing %s to %s", e.response.StatusCode, e.response.Request.Method, e.response.Request.URL.String()) 24 } 25 26 func (e *statusCodeError) Temporary() bool { 27 return e.response.StatusCode == 429 || e.response.StatusCode >= 500 28 } 29 30 // shouldRetry returns a boolean as to whether this err deserves to be 31 // retried. It returns the err as a convenience 32 func shouldRetry(err error) (bool, error) { 33 if err == nil { 34 return false, nil 35 } 36 if perr, ok := err.(*putio.ErrorResponse); ok { 37 err = &statusCodeError{response: perr.Response} 38 } 39 if fserrors.ShouldRetry(err) { 40 return true, err 41 } 42 return false, err 43 }