diff --git a/client/client.go b/client/client.go index cc52fba..0886413 100644 --- a/client/client.go +++ b/client/client.go @@ -79,6 +79,11 @@ func (c *Client) get(path string, values *url.Values, out interface{}) error { } defer resp.Body.Close() + err = c.rateLimit.MaybeRetryAfter(resp) + if err != nil { + return err + } + dec := json.NewDecoder(resp.Body) if resp.StatusCode != 200 { diff --git a/client/ratelimit.go b/client/ratelimit.go index c7adf4c..a91b2b0 100644 --- a/client/ratelimit.go +++ b/client/ratelimit.go @@ -1,5 +1,7 @@ package client +import "net/http" +import "strconv" import "sync" import "time" @@ -49,7 +51,21 @@ func (rl *RateLimit) AcquireN(cost float64) { } } -// Handle a Retry-After server response +func (rl *RateLimit) MaybeRetryAfter(resp *http.Response) error { + header := resp.Header.Get("Retry-After") + if header == "" { + return nil + } + + retryAfter, err := strconv.ParseInt(header, 10, 64) + if err != nil { + return err + } + + rl.RetryAfter(retryAfter) + return nil +} + func (rl *RateLimit) RetryAfter(seconds int64) { rl.mu.Lock() defer rl.mu.Unlock()