From a23464dfa1e707eddb997071e24c8e2979d95b02 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Sun, 13 Sep 2015 16:22:41 +0200 Subject: [PATCH] Retry if a timeout occurs. This happens more rarely than 500, but can still be encountered. --- amazonclouddrive/amazonclouddrive.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/amazonclouddrive/amazonclouddrive.go b/amazonclouddrive/amazonclouddrive.go index 82adbd9fe..f85e77b93 100644 --- a/amazonclouddrive/amazonclouddrive.go +++ b/amazonclouddrive/amazonclouddrive.go @@ -15,7 +15,9 @@ import ( "fmt" "io" "log" + "net" "net/http" + "net/url" "regexp" "strings" "time" @@ -126,8 +128,7 @@ func parsePath(path string) (root string) { // shouldRetry returns a boolean as to whether this resp and err // deserve to be retried. It returns the err as a convenience func shouldRetry(resp *http.Response, err error) (bool, error) { - // FIXME retry other http codes? - // 409 conflict ? + // Retry on 429 Rate exceeded. if err != nil && resp != nil && resp.StatusCode == 429 { return true, err } @@ -135,6 +136,18 @@ func shouldRetry(resp *http.Response, err error) (bool, error) { if err != nil && resp != nil && resp.StatusCode == 500 { return true, err } + // Allow retry if request times out. Adapted from + // http://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error + switch err := err.(type) { + case *url.Error: + if err, ok := err.Err.(net.Error); ok && err.Timeout() { + return true, err + } + case net.Error: + if err.Timeout() { + return true, err + } + } return false, err }