forked from thrasher-corp/gocryptotrader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
retry.go
55 lines (44 loc) · 1.08 KB
/
retry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package request
import (
"net"
"net/http"
"strconv"
"time"
)
const (
headerRetryAfter = "Retry-After"
)
// DefaultRetryPolicy determines whether the request should be retried, implemented with a default strategy.
func DefaultRetryPolicy(resp *http.Response, err error) (bool, error) {
if err != nil {
if timeoutErr, ok := err.(net.Error); ok && timeoutErr.Timeout() {
return true, nil
}
return false, err
}
if resp.StatusCode == http.StatusTooManyRequests {
return true, nil
}
if resp.Header.Get(headerRetryAfter) != "" {
return true, nil
}
return false, nil
}
// RetryAfter parses the Retry-After header in the response to determine the minimum
// duration needed to wait before retrying.
func RetryAfter(resp *http.Response, now time.Time) time.Duration {
if resp == nil {
return 0
}
after := resp.Header.Get(headerRetryAfter)
if after == "" {
return 0
}
if sec, err := strconv.ParseInt(after, 10, 32); err == nil {
return time.Duration(sec) * time.Second
}
if when, err := time.Parse(time.RFC1123, after); err == nil {
return when.Sub(now)
}
return 0
}