提交 0a4f3b80 编写于 作者: M Mislav Marohnić

[api] Honor rate limit for HTTP 403 responses

上级 ea016182
......@@ -238,7 +238,7 @@ func apiCommand(_ *Command, args *Args) {
body = params
}
rateLimit := args.Flag.Bool("--rate-limit")
rateLimitWait := args.Flag.Bool("--rate-limit")
gh := github.NewClient(host)
......@@ -253,8 +253,13 @@ func apiCommand(_ *Command, args *Args) {
for {
response, err := gh.GenericAPIRequest(method, path, body, headers, cacheTTL)
utils.Check(err)
success := response.StatusCode < 300
if rateLimitWait && response.StatusCode == 403 && response.RateLimitRemaining() == 0 {
pauseUntil(response.RateLimitReset())
continue
}
success := response.StatusCode < 300
jsonType := true
if !success {
jsonType, _ = regexp.MatchString(`[/+]json(?:;|$)`, response.Header.Get("Content-Type"))
......@@ -306,15 +311,21 @@ func apiCommand(_ *Command, args *Args) {
fmt.Fprintf(out, "\n")
}
if rateLimit && response.RateLimitRemaining() == 0 {
resetAt := response.RateLimitReset()
rollover := time.Unix(int64(resetAt)+1, 0)
ui.Errorf("API rate limit reached; pausing until %v ...\n", rollover)
time.Sleep(time.Until(rollover))
if rateLimitWait && response.RateLimitRemaining() == 0 {
pauseUntil(response.RateLimitReset())
}
}
}
func pauseUntil(timestamp int) {
rollover := time.Unix(int64(timestamp)+1, 0)
duration := time.Until(rollover)
if duration > 0 {
ui.Errorf("API rate limit reached; pausing until %v ...\n", rollover)
time.Sleep(duration)
}
}
const (
trueVal = "true"
falseVal = "false"
......
......@@ -437,3 +437,20 @@ Feature: hub api
"""
When I successfully run `hub api --rate-limit --paginate hello`
Then the stderr should contain "API rate limit reached; pausing until "
Scenario: Honor rate limit for 403s
Given the GitHub API server:
"""
count = 0
get('/hello') {
count += 1
if count == 1
response.headers['X-Ratelimit-Remaining'] = '0'
response.headers['X-Ratelimit-Reset'] = Time.now.utc.to_i.to_s
halt 403
end
json [{}]
}
"""
When I successfully run `hub api --rate-limit hello`
Then the stderr should contain "API rate limit reached; pausing until "
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册