From a275448d02172d1c40b1dcdee4e4392c703618d0 Mon Sep 17 00:00:00 2001 From: Evgeniy Guseletov Date: Fri, 22 May 2015 13:30:32 +0800 Subject: [PATCH] Use actual api limit from header --- .../HttpClient/Listener/ErrorListener.php | 3 +- .../HttpClient/Listener/ErrorListenerTest.php | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/Github/HttpClient/Listener/ErrorListener.php b/lib/Github/HttpClient/Listener/ErrorListener.php index a945c45c621..72736255429 100644 --- a/lib/Github/HttpClient/Listener/ErrorListener.php +++ b/lib/Github/HttpClient/Listener/ErrorListener.php @@ -40,9 +40,10 @@ public function onRequestError(Event $event) if ($response->isClientError() || $response->isServerError()) { $remaining = (string) $response->getHeader('X-RateLimit-Remaining'); + $limit = $response->getHeader('X-RateLimit-Limit'); if (null != $remaining && 1 > $remaining && 'rate_limit' !== substr($request->getResource(), 1, 10)) { - throw new ApiLimitExceedException($this->options['api_limit']); + throw new ApiLimitExceedException($limit); } if (401 === $response->getStatusCode()) { diff --git a/test/Github/Tests/HttpClient/Listener/ErrorListenerTest.php b/test/Github/Tests/HttpClient/Listener/ErrorListenerTest.php index 3715ee57d3d..ee783a888b6 100644 --- a/test/Github/Tests/HttpClient/Listener/ErrorListenerTest.php +++ b/test/Github/Tests/HttpClient/Listener/ErrorListenerTest.php @@ -30,10 +30,14 @@ public function shouldFailWhenApiLimitWasExceed() $response->expects($this->once()) ->method('isClientError') ->will($this->returnValue(true)); - $response->expects($this->once()) + $response->expects($this->at(1)) ->method('getHeader') ->with('X-RateLimit-Remaining') ->will($this->returnValue(0)); + $response->expects($this->at(2)) + ->method('getHeader') + ->with('X-RateLimit-Limit') + ->will($this->returnValue(5000)); $listener = new ErrorListener(array('api_limit' => 5000)); $listener->onRequestError($this->getEventMock($response)); @@ -49,10 +53,15 @@ public function shouldNotPassWhenContentWasNotValidJson() $response->expects($this->once()) ->method('isClientError') ->will($this->returnValue(true)); - $response->expects($this->once()) + $response->expects($this->at(1)) ->method('getHeader') ->with('X-RateLimit-Remaining') ->will($this->returnValue(5000)); + $response->expects($this->at(2)) + ->method('getHeader') + ->with('X-RateLimit-Limit') + ->will($this->returnValue(5000)); + $response->expects($this->once()) ->method('getBody') ->will($this->returnValue('fail')); @@ -71,10 +80,14 @@ public function shouldNotPassWhenContentWasValidJsonButStatusIsNotCovered() $response->expects($this->once()) ->method('isClientError') ->will($this->returnValue(true)); - $response->expects($this->once()) + $response->expects($this->at(1)) ->method('getHeader') ->with('X-RateLimit-Remaining') ->will($this->returnValue(5000)); + $response->expects($this->at(2)) + ->method('getHeader') + ->with('X-RateLimit-Limit') + ->will($this->returnValue(5000)); $response->expects($this->once()) ->method('getBody') ->will($this->returnValue(json_encode(array('message' => 'test')))); @@ -96,10 +109,14 @@ public function shouldNotPassWhen400IsSent() $response->expects($this->once()) ->method('isClientError') ->will($this->returnValue(true)); - $response->expects($this->once()) + $response->expects($this->at(1)) ->method('getHeader') ->with('X-RateLimit-Remaining') ->will($this->returnValue(5000)); + $response->expects($this->at(2)) + ->method('getHeader') + ->with('X-RateLimit-Limit') + ->will($this->returnValue(5000)); $response->expects($this->once()) ->method('getBody') ->will($this->returnValue(json_encode(array('message' => 'test')))); @@ -134,10 +151,14 @@ public function shouldNotPassWhen422IsSentWithErrorCode($errorCode) $response->expects($this->once()) ->method('isClientError') ->will($this->returnValue(true)); - $response->expects($this->once()) + $response->expects($this->at(1)) ->method('getHeader') ->with('X-RateLimit-Remaining') ->will($this->returnValue(5000)); + $response->expects($this->at(2)) + ->method('getHeader') + ->with('X-RateLimit-Limit') + ->will($this->returnValue(5000)); $response->expects($this->once()) ->method('getBody') ->will($this->returnValue($content)); @@ -170,6 +191,8 @@ public function shouldThrowTwoFactorAuthenticationRequiredException() return 5000; case 'X-GitHub-OTP': return 'required; sms'; + case 'X-RateLimit-Limit': + return 5000; } })); $response->expects($this->any())