Skip to content

Commit 55e881a

Browse files
API rate limit error status can be 403
1 parent c230ab0 commit 55e881a

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

lib/Github/HttpClient/Plugin/GithubExceptionThrower.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,21 @@ public function handleRequest(RequestInterface $request, callable $next, callabl
120120
throw new SsoRequiredException($url);
121121
}
122122

123+
$remaining = ResponseMediator::getHeader($response, 'X-RateLimit-Remaining');
124+
if ((403 === $response->getStatusCode()) && null !== $remaining && 1 > $remaining && isset($content['message']) && (0 === strpos($content['message'], 'API rate limit exceeded'))) {
125+
$limit = (int) ResponseMediator::getHeader($response, 'X-RateLimit-Limit');
126+
$reset = (int) ResponseMediator::getHeader($response, 'X-RateLimit-Reset');
127+
128+
throw new ApiLimitExceedException($limit, $reset);
129+
}
130+
131+
$reset = (int) ResponseMediator::getHeader($response, 'X-RateLimit-Reset');
132+
if ((403 === $response->getStatusCode()) && 0 < $reset && isset($content['message']) && (0 === strpos($content['message'], 'You have exceeded a secondary rate limit.'))) {
133+
$limit = (int) ResponseMediator::getHeader($response, 'X-RateLimit-Limit');
134+
135+
throw new ApiLimitExceedException($limit, $reset);
136+
}
137+
123138
throw new RuntimeException(isset($content['message']) ? $content['message'] : $content, $response->getStatusCode());
124139
});
125140
}

test/Github/Tests/HttpClient/Plugin/GithubExceptionThrowerTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,40 @@ public static function responseProvider()
7575
),
7676
'exception' => new \Github\Exception\ApiLimitExceedException(5000),
7777
],
78+
'Rate Limit Exceeded via 403 status' => [
79+
'response' => new Response(
80+
403,
81+
[
82+
'Content-Type' => 'application/json',
83+
'X-RateLimit-Remaining' => 0,
84+
'X-RateLimit-Limit' => 5000,
85+
'X-RateLimit-Reset' => 1609245810,
86+
],
87+
json_encode(
88+
[
89+
'message' => 'API rate limit exceeded for installation ID xxxxxxx.',
90+
]
91+
)
92+
),
93+
'exception' => new \Github\Exception\ApiLimitExceedException(5000),
94+
],
95+
'Secondary Rate Limit Exceeded via 403 status' => [
96+
'response' => new Response(
97+
403,
98+
[
99+
'Content-Type' => 'application/json',
100+
'X-RateLimit-Remaining' => 100,
101+
'X-RateLimit-Limit' => 5000,
102+
'X-RateLimit-Reset' => 1609245810,
103+
],
104+
json_encode(
105+
[
106+
'message' => 'You have exceeded a secondary rate limit. Please wait a few minutes before you try again.',
107+
]
108+
)
109+
),
110+
'exception' => new \Github\Exception\ApiLimitExceedException(5000),
111+
],
78112
'Two Factor Authentication Required' => [
79113
'response' => new Response(
80114
401,

0 commit comments

Comments
 (0)