Skip to content

Commit ce38c9b

Browse files
committed
feat: add possibility to have an automated retry on 429
1 parent 3571ad7 commit ce38c9b

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

sdk/api_client.go

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package webexteams
22

33
import (
4+
"errors"
5+
"fmt"
6+
"net/http"
47
"os"
8+
"strconv"
9+
"time"
510

611
"github.com/go-resty/resty/v2"
712
)
@@ -35,14 +40,46 @@ type Client struct {
3540
}
3641

3742
type service struct {
38-
client *resty.Client
43+
client *resty.Client
44+
retryOnTooManyRequests bool
3945
}
4046

4147
// SetAuthToken defines the Authorization token sent in the request
4248
func (s *Client) SetAuthToken(accessToken string) {
4349
s.common.client.SetAuthToken(accessToken)
4450
}
4551

52+
func (s *Client) AddRetryOnTooManyRequestsStatus() {
53+
if s.common.retryOnTooManyRequests {
54+
return
55+
}
56+
s.common.client.SetRetryCount(3)
57+
s.common.client.SetRetryAfter(
58+
func(c *resty.Client, r *resty.Response) (time.Duration, error) {
59+
// Retrying but not on a 429, we retry immediately
60+
if r.StatusCode() != http.StatusTooManyRequests {
61+
return time.Duration(0), nil
62+
}
63+
retryAfterRaw := r.Header().Get("Retry-After")
64+
if retryAfterRaw == "" {
65+
return 0, errors.New("received a 429, but got an empty Retry-After header")
66+
}
67+
retryAfter, err := strconv.Atoi(retryAfterRaw)
68+
if err != nil {
69+
return 0, fmt.Errorf("invalid Retry-After header: %v", retryAfterRaw)
70+
}
71+
fmt.Println(time.Second * time.Duration(retryAfter))
72+
return time.Second * time.Duration(retryAfter), nil
73+
},
74+
)
75+
s.common.client.AddRetryCondition(
76+
func(r *resty.Response, err error) bool {
77+
return r.StatusCode() == http.StatusTooManyRequests
78+
},
79+
)
80+
s.common.retryOnTooManyRequests = true
81+
}
82+
4683
// NewClient creates a new API client. Requires a userAgent string describing your application.
4784
// optionally a custom http.Client to allow for advanced features such as caching.
4885
func NewClient() *Client {

0 commit comments

Comments
 (0)