feat: retry api requests when closed immediately due to overload

This commit is contained in:
Björn Fromme committed 2026-01-06 17:29:34 +01:00
1 parent 62fc734f82
commit 6008a1b2d9
3 files changed
+113 -2

No files matched your search

+13
View File
@@ -3,6 +3,7 @@
namespace App\BusProNet\Traits;
use App\BusProNet\Exception\ApiClientException;
use App\BusProNet\Exception\ImmediateConnectionCloseException;
use App\BusProNet\Exception\TimeoutException;
trait ApiClientTrait
@@ -90,6 +91,7 @@ trait ApiClientTrait
/**
* @throws TimeoutException
* @throws ImmediateConnectionCloseException
*/
private function receive($socket, int $totalTimeout): string
{
@@ -115,6 +117,17 @@ trait ApiClientTrait
// Check if stream timed out on this specific read
$metadata = stream_get_meta_data($socket);
if (true === $metadata['timed_out']) {
// Check if this is an immediate rejection (0 bytes, < 1 second)
// This indicates the server is busy rather than a true timeout
if (0 === strlen($response) && $elapsedTime < 1.0) {
$this->logger->warning('Server closed connection immediately', [
'elapsed_time' => $elapsedTime,
'bytes_received' => 0,
'read_attempts' => $readAttempts,
]);
throw new ImmediateConnectionCloseException('Server closed connection immediately - server may be busy');
}
$this->logger->error('Stream read timeout detected', [
'elapsed_time' => $elapsedTime,
'bytes_received' => strlen($response),