From 2335bcf09afb0c08de318da6f0828e6a3a95aa92 Mon Sep 17 00:00:00 2001 From: Luca Osti Date: Mon, 21 Mar 2022 12:27:48 +0100 Subject: [PATCH] Comply with rate limit --- _deploy/main.go | 2 +- _deploy/zendesk.go | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/_deploy/main.go b/_deploy/main.go index 191da3aa..a39d1fa7 100644 --- a/_deploy/main.go +++ b/_deploy/main.go @@ -44,7 +44,7 @@ func main() { must(err) // Connect to zendesk - transport := BasicAuthTransport{ + transport := ZendeskAuthTransport{ Username: Config.ZendeskUser + "/token", Password: Config.ZendeskToken, } diff --git a/_deploy/zendesk.go b/_deploy/zendesk.go index 5c12165a..52d9a0c8 100644 --- a/_deploy/zendesk.go +++ b/_deploy/zendesk.go @@ -10,6 +10,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "time" ) @@ -440,17 +441,27 @@ func (z *Zendesk) DeleteAttachment(attachmentID int) (err error) { return nil } -type BasicAuthTransport struct { +type ZendeskAuthTransport struct { Username string Password string } -func (bat BasicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { - req.SetBasicAuth(bat.Username, bat.Password) +func (z ZendeskAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { + req.SetBasicAuth(z.Username, z.Password) - return http.DefaultTransport.RoundTrip(req) + res, err := http.DefaultTransport.RoundTrip(req) + if res.StatusCode == 429 { + // we hit the rate limit, wait for the suggested seconds and retry + if waitFor, castErr := strconv.Atoi(res.Header.Get("Retry-After")); castErr == nil { + Log.Warnf("Rate limited: wait for %d seconds", waitFor) + + time.Sleep(time.Duration(waitFor) * time.Second) + return http.DefaultTransport.RoundTrip(req) + } + } + return res, err } -func (bat *BasicAuthTransport) Client() *http.Client { - return &http.Client{Transport: bat} +func (z *ZendeskAuthTransport) Client() *http.Client { + return &http.Client{Transport: z} }