Skip to content

Commit 2c953d2

Browse files
author
darkdarin
committed
fix: auto retry when "too many request" error from API
1 parent 5a1ed18 commit 2c953d2

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

src/DTO/Response.php

+1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ public function __construct(
99
public mixed $result = null,
1010
public ?int $error_code = null,
1111
public ?string $description = null,
12+
public ?ResponseParameters $parameters = null,
1213
) {}
1314
}

src/DTO/ResponseParameters.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace DarkDarin\TelegramBotSdk\DTO;
4+
5+
/**
6+
* Describes why a request was unsuccessful.
7+
*
8+
* @link https://core.telegram.org/bots/api#responseparameters
9+
*/
10+
readonly class ResponseParameters
11+
{
12+
public function __construct(
13+
public ?int $migrate_to_chat_id = null,
14+
public ?int $retry_after = null,
15+
) {}
16+
}

src/TransportClient/TransportClient.php

+17-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
class TransportClient implements TransportClientInterface
1919
{
2020
private const BASE_URL = 'https://api.telegram.org';
21+
private const MAX_RETRY = 10;
2122

2223
public function __construct(
2324
private readonly ClientInterface $client,
@@ -55,9 +56,22 @@ public function executeMethod(
5556
} else {
5657
$request = $this->makeJsonRequest($method, $parameters);
5758
}
58-
$rawResponse = $this->client->sendRequest($request);
59-
/** @var Response $response */
60-
$response = $this->serializer->deserialize($rawResponse->getBody()->getContents(), Response::class, 'json');
59+
60+
$result = false;
61+
$retryCount = 0;
62+
63+
do {
64+
$retryCount++;
65+
$rawResponse = $this->client->sendRequest($request);
66+
/** @var Response $response */
67+
$response = $this->serializer->deserialize($rawResponse->getBody()->getContents(), Response::class, 'json');
68+
// If returned "Too many requests" - retry after some time
69+
if ($response->error_code === 429) {
70+
sleep($response->parameters?->retry_after ?? 1);
71+
continue;
72+
}
73+
$result = true;
74+
} while (!$result || $retryCount >= self::MAX_RETRY);
6175

6276
if ($response->error_code !== null || $rawResponse->getStatusCode() !== 200) {
6377
throw new TelegramException(

0 commit comments

Comments
 (0)