Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
github
hub
提交
0a4f3b80
H
hub
项目概览
github
/
hub
10 个月 前同步成功
通知
3
Star
22523
Fork
2406
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hub
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0a4f3b80
编写于
10月 30, 2019
作者:
M
Mislav Marohnić
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[api] Honor rate limit for HTTP 403 responses
上级
ea016182
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
35 addition
and
7 deletion
+35
-7
commands/api.go
commands/api.go
+18
-7
features/api.feature
features/api.feature
+17
-0
未找到文件。
commands/api.go
浏览文件 @
0a4f3b80
...
...
@@ -238,7 +238,7 @@ func apiCommand(_ *Command, args *Args) {
body
=
params
}
rateLimit
:=
args
.
Flag
.
Bool
(
"--rate-limit"
)
rateLimit
Wait
:=
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"
...
...
features/api.feature
浏览文件 @
0a4f3b80
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录