Skip to content

Commit ed0645e

Browse files
authored
Merge pull request #285 from saloonphp/feature/v3-contract-friendly-retries-2
Feature | V3 Contract Friendly Retries
2 parents 4de0efe + e334c76 commit ed0645e

File tree

5 files changed

+93
-17
lines changed

5 files changed

+93
-17
lines changed

src/Helpers/RetryHelper.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Saloon\Helpers;
6+
7+
use Saloon\Contracts\Request;
8+
use Saloon\Contracts\Connector;
9+
10+
/**
11+
* @internal
12+
*/
13+
final class RetryHelper
14+
{
15+
/**
16+
* Get max tries on a connector or request
17+
*/
18+
public static function getMaxTries(Connector $connector, Request $request): int
19+
{
20+
$maxTries = 1;
21+
22+
if (property_exists($connector, 'tries') && is_int($connector->tries)) {
23+
$maxTries = $connector->tries;
24+
}
25+
26+
if (property_exists($request, 'tries') && is_int($request->tries)) {
27+
$maxTries = $request->tries;
28+
}
29+
30+
if ($maxTries <= 0) {
31+
$maxTries = 1;
32+
}
33+
34+
return $maxTries;
35+
}
36+
37+
/**
38+
* Get retry interval on a connector or request
39+
*/
40+
public static function getRetryInterval(Connector $connector, Request $request): int
41+
{
42+
$retryInterval = 0;
43+
44+
if (property_exists($connector, 'retryInterval') && is_int($connector->retryInterval)) {
45+
$retryInterval = $connector->retryInterval;
46+
}
47+
48+
if (property_exists($request, 'retryInterval') && is_int($request->retryInterval)) {
49+
$retryInterval = $request->retryInterval;
50+
}
51+
52+
if ($retryInterval <= 0) {
53+
$retryInterval = 0;
54+
}
55+
56+
return $retryInterval;
57+
}
58+
59+
/**
60+
* Should throw on max tries
61+
*/
62+
public static function getThrowOnMaxTries(Connector $connector, Request $request): bool
63+
{
64+
$throwOnMaxTries = true;
65+
66+
if (property_exists($connector, 'throwOnMaxTries') && is_bool($connector->throwOnMaxTries)) {
67+
$throwOnMaxTries = $connector->throwOnMaxTries;
68+
}
69+
70+
if (property_exists($request, 'throwOnMaxTries') && is_bool($request->throwOnMaxTries)) {
71+
$throwOnMaxTries = $request->throwOnMaxTries;
72+
}
73+
74+
return $throwOnMaxTries;
75+
}
76+
}

src/Http/Connector.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
use Saloon\Traits\Connector\SendsRequests;
1717
use Saloon\Traits\Auth\AuthenticatesRequests;
1818
use Saloon\Traits\RequestProperties\HasDelay;
19-
use Saloon\Traits\RequestProperties\HasTries;
19+
use Saloon\Traits\RequestProperties\Retryable;
2020
use Saloon\Traits\Responses\HasCustomResponses;
2121
use Saloon\Traits\Request\CreatesDtoFromResponse;
2222
use Saloon\Contracts\Connector as ConnectorContract;
@@ -39,6 +39,6 @@ abstract class Connector implements ConnectorContract, HasDebuggingContract
3939
use Makeable;
4040
use HasPool;
4141
use HasDelay;
42-
use HasTries;
42+
use Retryable;
4343
use HasDebugging;
4444
}

src/Http/Request.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,26 @@
1313
use Saloon\Traits\HandlesPsrRequest;
1414
use Saloon\Traits\ManagesExceptions;
1515
use Saloon\Traits\Auth\AuthenticatesRequests;
16-
use Saloon\Traits\RequestProperties\HasTries;
16+
use Saloon\Traits\RequestProperties\Retryable;
1717
use Saloon\Traits\Responses\HasCustomResponses;
1818
use Saloon\Contracts\Request as RequestContract;
1919
use Saloon\Traits\Request\CreatesDtoFromResponse;
2020
use Saloon\Traits\RequestProperties\HasRequestProperties;
2121

2222
abstract class Request implements RequestContract
2323
{
24+
use CreatesDtoFromResponse;
2425
use AuthenticatesRequests;
2526
use HasRequestProperties;
26-
use CreatesDtoFromResponse;
2727
use HasCustomResponses;
2828
use ManagesExceptions;
2929
use HandlesPsrRequest;
3030
use HasMockClient;
3131
use Conditionable;
3232
use HasDebugging;
33+
use Retryable;
3334
use Bootable;
3435
use Makeable;
35-
use HasTries;
3636

3737
/**
3838
* Define the HTTP method.

src/Traits/Connector/SendsRequests.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
namespace Saloon\Traits\Connector;
66

77
use LogicException;
8+
use Saloon\Helpers\Helpers;
9+
use InvalidArgumentException;
810
use Saloon\Contracts\Request;
911
use Saloon\Contracts\Response;
1012
use GuzzleHttp\Promise\Promise;
13+
use Saloon\Helpers\RetryHelper;
1114
use Saloon\Http\PendingRequest;
1215
use Saloon\Contracts\MockClient;
1316
use GuzzleHttp\Promise\PromiseInterface;
17+
use Saloon\Traits\RequestProperties\Retryable;
1418
use Saloon\Exceptions\Request\RequestException;
1519
use Saloon\Exceptions\Request\FatalRequestException;
1620
use Saloon\Contracts\PendingRequest as PendingRequestContract;
@@ -32,17 +36,9 @@ public function send(Request $request, MockClient $mockClient = null, callable $
3236
$handleRetry = static fn (): bool => true;
3337
}
3438

35-
$maxTries = $request->tries ?? $this->tries ?? 1;
36-
$retryInterval = $request->retryInterval ?? $this->retryInterval ?? 0;
37-
$throwOnMaxTries = $request->throwOnMaxTries ?? $this->throwOnMaxTries ?? true;
38-
39-
if ($maxTries <= 0) {
40-
$maxTries = 1;
41-
}
42-
43-
if ($retryInterval <= 0) {
44-
$retryInterval = 0;
45-
}
39+
$maxTries = RetryHelper::getMaxTries($this, $request);
40+
$retryInterval = RetryHelper::getRetryInterval($this, $request);
41+
$throwOnMaxTries = RetryHelper::getThrowOnMaxTries($this, $request);
4642

4743
$attempts = 0;
4844

@@ -155,6 +151,10 @@ public function sendAsync(Request $request, MockClient $mockClient = null): Prom
155151
*/
156152
public function sendAndRetry(Request $request, int $tries, int $interval = 0, callable $handleRetry = null, bool $throw = true, MockClient $mockClient = null): Response
157153
{
154+
if (! array_key_exists(Retryable::class, Helpers::classUsesRecursive($request))) {
155+
throw new InvalidArgumentException('The request class must use the "Retryable" trait.');
156+
}
157+
158158
$request->tries = $tries;
159159
$request->retryInterval = $interval;
160160
$request->throwOnMaxTries = $throw;

src/Traits/RequestProperties/HasTries.php renamed to src/Traits/RequestProperties/Retryable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Saloon\Exceptions\Request\RequestException;
99
use Saloon\Exceptions\Request\FatalRequestException;
1010

11-
trait HasTries
11+
trait Retryable
1212
{
1313
/**
1414
* The number of times a request should be retried if a failure response is returned.

0 commit comments

Comments
 (0)