Retry-After support

This commit is contained in:
Ian Gulliver
2021-09-28 04:43:38 +00:00
parent 5f61b928f8
commit d82b945668
2 changed files with 22 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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()