Skip to content

Commit ee1fcdb

Browse files
Check if all X-RateLimit headers are available (#2)
1 parent 03b9844 commit ee1fcdb

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

src/Listeners/StoreRateLimitsListener.php

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88

99
class StoreRateLimitsListener
1010
{
11+
protected array $headers = [
12+
'X-RateLimit-Limit',
13+
'X-RateLimit-Remaining',
14+
'X-RateLimit-Reset',
15+
'X-RateLimit-Minutely-Limit',
16+
'X-RateLimit-Minutely-Remaining',
17+
'X-RateLimit-Minutely-Reset',
18+
];
19+
1120
public function handle(ExactResponseEvent $event): void
1221
{
1322
$response = $event->response;
@@ -16,15 +25,23 @@ public function handle(ExactResponseEvent $event): void
1625
return;
1726
}
1827

28+
$headers = $response->headers();
29+
30+
$missing = array_diff($this->headers, array_keys($headers));
31+
32+
if (count($missing) > 0) {
33+
return;
34+
}
35+
1936
RateLimit::query()->updateOrCreate([
2037
'exact_division' => $event->division,
2138
'timestamp' => now()->startOfDay()->getTimestamp(),
2239
], [
23-
'limit' => $response->header('X-RateLimit-Limit'),
24-
'remaining' => $response->header('X-RateLimit-Remaining'),
40+
'limit' => (int) $response->header('X-RateLimit-Limit'),
41+
'remaining' => (int) $response->header('X-RateLimit-Remaining'),
2542
'reset_at' => Carbon::createFromTimestampMs($response->header('X-RateLimit-Reset')),
26-
'minutely_limit' => $response->header('X-RateLimit-Minutely-Limit'),
27-
'minutely_remaining' => $response->header('X-RateLimit-Minutely-Remaining'),
43+
'minutely_limit' => (int) $response->header('X-RateLimit-Minutely-Limit'),
44+
'minutely_remaining' => (int) $response->header('X-RateLimit-Minutely-Remaining'),
2845
'minutely_reset_at' => Carbon::createFromTimestampMs($response->header('X-RateLimit-Minutely-Reset')),
2946
]);
3047
}

tests/Listeners/StoreRateLimitsListenerTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,28 @@ public function it_can_skip_failures(): void
7070

7171
$this->assertNull($rateLimit);
7272
}
73+
74+
#[Test]
75+
public function it_can_skip_when_headers_are_missing(): void
76+
{
77+
Carbon::setTestNow('2024-01-01 00:00:00');
78+
79+
$response = new Response(
80+
new Psr7Response(200, [
81+
'X-RateLimit-Limit' => '1000',
82+
'X-RateLimit-Remaining' => '500',
83+
'X-RateLimit-Reset' => (string) now()->addMinute()->getTimestampMs(),
84+
])
85+
);
86+
87+
ExactResponseEvent::dispatch($response, '::connection::', '::division::');
88+
89+
/** @var ?RateLimit $rateLimit */
90+
$rateLimit = RateLimit::query()
91+
->where('exact_division', '=', '::division::')
92+
->where('timestamp', '=', now()->getTimestamp())
93+
->first();
94+
95+
$this->assertNull($rateLimit);
96+
}
7397
}

0 commit comments

Comments
 (0)