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  }