Skip to content

Commit 3bf523d

Browse files
author
Dominic Scheirlinck
committed
Allow access to rate limiter headers
1 parent c9f84d8 commit 3bf523d

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/IntercomClient.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class IntercomClient
5555
/** @var IntercomNotes $notes */
5656
public $notes;
5757

58+
/** @var int[] $rateLimitDetails */
59+
protected $rateLimitDetails;
60+
5861
/**
5962
* IntercomClient constructor.
6063
* @param string $usernamePart App ID.
@@ -202,8 +205,37 @@ public function getAuth()
202205
*/
203206
private function handleResponse(Response $response)
204207
{
208+
$this->setRateLimitDetails($response);
209+
205210
$stream = stream_for($response->getBody());
206211
$data = json_decode($stream);
207212
return $data;
208213
}
214+
215+
/**
216+
* @param Response $response
217+
* @return void
218+
*/
219+
private function setRateLimitDetails(Response $response)
220+
{
221+
$this->rateLimitDetails = [
222+
'limit' => $response->hasHeader('X-RateLimit-Limit')
223+
? (int)$response->getHeader('X-RateLimit-Limit')
224+
: null,
225+
'remaining' => $response->hasHeader('X-RateLimit-Remaining')
226+
? (int)$response->getHeader('X-RateLimit-Remaining')
227+
: null,
228+
'reset_at' => $response->hasHeader('X-RateLimit-Reset')
229+
? (new \DateTimeImmutable())->setTimestamp((int)$response->getHeader('X-RateLimit-Reset'))
230+
: null,
231+
];
232+
}
233+
234+
/**
235+
* @return int[]
236+
*/
237+
public function getRateLimitDetails()
238+
{
239+
return $this->rateLimitDetails;
240+
}
209241
}

test/IntercomClientTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,30 @@ public function testPaginationHelper()
6161
}
6262
}
6363

64+
public function testRateLimitDetails()
65+
{
66+
$mock = new MockHandler([
67+
new Response(200, ['X-RateLimit-Limit' => '83', 'X-RateLimit-Remaining' => '2', 'X-RateLimit-Reset' => time() + 7], "{\"foo\":\"bar\"}")
68+
]);
69+
70+
$container = [];
71+
$history = Middleware::history($container);
72+
$stack = HandlerStack::create($mock);
73+
$stack->push($history);
74+
75+
$http_client = new Client(['handler' => $stack]);
76+
77+
$client = new IntercomClient('u', 'p');
78+
$client->setClient($http_client);
79+
80+
$client->users->create([
81+
'email' => '[email protected]'
82+
]);
83+
84+
$rateLimitDetails = $client->getRateLimitDetails();
85+
$this->assertInternalType('array', $rateLimitDetails);
86+
$this->assertArrayHasKey('limit', $rateLimitDetails);
87+
$this->assertArrayHasKey('remaining', $rateLimitDetails);
88+
$this->assertArrayHasKey('reset_at', $rateLimitDetails);
89+
}
6490
}

0 commit comments

Comments
 (0)