Retry if a timeout occurs.

This happens more rarely than 500, but can still be encountered.
This commit is contained in:
Klaus Post 2015-09-13 16:22:41 +02:00 committed by Nick Craig-Wood
parent 6ac7145d2d
commit fa87077211

View file

@ -15,7 +15,9 @@ import (
"fmt"
"io"
"log"
"net"
"net/http"
"net/url"
"regexp"
"strings"
"time"
@ -124,8 +126,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
}
@ -133,6 +134,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
}