mirror of
https://github.com/rclone/rclone.git
synced 2024-11-29 20:04:52 +01:00
onedrive: add support "Retry-After" header
This commit is contained in:
parent
bfd9f32188
commit
7662f15939
@ -12,6 +12,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -380,13 +381,30 @@ var retryErrorCodes = []int{
|
|||||||
// shouldRetry returns a boolean as to whether this resp and err
|
// shouldRetry returns a boolean as to whether this resp and err
|
||||||
// deserve to be retried. It returns the err as a convenience
|
// deserve to be retried. It returns the err as a convenience
|
||||||
func shouldRetry(resp *http.Response, err error) (bool, error) {
|
func shouldRetry(resp *http.Response, err error) (bool, error) {
|
||||||
authRetry := false
|
retry := false
|
||||||
|
if resp != nil {
|
||||||
if resp != nil && resp.StatusCode == 401 && len(resp.Header["Www-Authenticate"]) == 1 && strings.Index(resp.Header["Www-Authenticate"][0], "expired_token") >= 0 {
|
switch resp.StatusCode {
|
||||||
authRetry = true
|
case 401:
|
||||||
|
if len(resp.Header["Www-Authenticate"]) == 1 && strings.Index(resp.Header["Www-Authenticate"][0], "expired_token") >= 0 {
|
||||||
|
retry = true
|
||||||
fs.Debugf(nil, "Should retry: %v", err)
|
fs.Debugf(nil, "Should retry: %v", err)
|
||||||
}
|
}
|
||||||
return authRetry || fserrors.ShouldRetry(err) || fserrors.ShouldRetryHTTP(resp, retryErrorCodes), err
|
case 429: // Too Many Requests.
|
||||||
|
// see https://docs.microsoft.com/en-us/sharepoint/dev/general-development/how-to-avoid-getting-throttled-or-blocked-in-sharepoint-online
|
||||||
|
if values := resp.Header["Retry-After"]; len(values) == 1 && values[0] != "" {
|
||||||
|
retryAfter, parseErr := strconv.Atoi(values[0])
|
||||||
|
if parseErr != nil {
|
||||||
|
fs.Debugf(nil, "Failed to parse Retry-After: %q: %v", values[0], parseErr)
|
||||||
|
} else {
|
||||||
|
duration := time.Second * time.Duration(retryAfter)
|
||||||
|
retry = true
|
||||||
|
err = pacer.RetryAfterError(err, duration)
|
||||||
|
fs.Debugf(nil, "Too many requests. Trying again in %d seconds.", retryAfter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retry || fserrors.ShouldRetry(err) || fserrors.ShouldRetryHTTP(resp, retryErrorCodes), err
|
||||||
}
|
}
|
||||||
|
|
||||||
// readMetaDataForPathRelativeToID reads the metadata for a path relative to an item that is addressed by its normalized ID.
|
// readMetaDataForPathRelativeToID reads the metadata for a path relative to an item that is addressed by its normalized ID.
|
||||||
|
Loading…
Reference in New Issue
Block a user