Fixes #1788: Retry-After support for Dropbox backend
This commit is contained in:
parent
4138d5aa75
commit
8fb707e16d
1 changed files with 11 additions and 1 deletions
|
@ -31,6 +31,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox"
|
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox"
|
||||||
|
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/auth"
|
||||||
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/common"
|
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/common"
|
||||||
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/files"
|
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/files"
|
||||||
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/sharing"
|
"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/sharing"
|
||||||
|
@ -203,7 +204,16 @@ func shouldRetry(err error) (bool, error) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
baseErrString := errors.Cause(err).Error()
|
baseErrString := errors.Cause(err).Error()
|
||||||
// FIXME there is probably a better way of doing this!
|
// handle any official Retry-After header from Dropbox's SDK first
|
||||||
|
switch e := err.(type) {
|
||||||
|
case auth.RateLimitAPIError:
|
||||||
|
if e.RateLimitError.RetryAfter > 0 {
|
||||||
|
fs.Debugf(baseErrString, "Too many requests or write operations. Trying again in %d seconds.", e.RateLimitError.RetryAfter)
|
||||||
|
time.Sleep(time.Duration(e.RateLimitError.RetryAfter) * time.Second)
|
||||||
|
}
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
// Keep old behaviour for backward compatibility
|
||||||
if strings.Contains(baseErrString, "too_many_write_operations") || strings.Contains(baseErrString, "too_many_requests") {
|
if strings.Contains(baseErrString, "too_many_write_operations") || strings.Contains(baseErrString, "too_many_requests") {
|
||||||
return true, err
|
return true, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue