Skip to content

Commit

Permalink
[9.x] Allow HTTP client requests with retries to optionally throw Req…
Browse files Browse the repository at this point in the history
…uestExceptions (#40079)

* Update PendingRequest.php

* Update Factory.php

* Update HttpClientTest.php
  • Loading branch information
mattkingshott authored Dec 17, 2021
1 parent 8e46f9c commit ec7045e
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/Illuminate/Http/Client/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
* @method \Illuminate\Http\Client\PendingRequest contentType(string $contentType)
* @method \Illuminate\Http\Client\PendingRequest dd()
* @method \Illuminate\Http\Client\PendingRequest dump()
* @method \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleep = 0, ?callable $when = null)
* @method \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleep = 0, ?callable $when = null, bool $throw = true)
* @method \Illuminate\Http\Client\PendingRequest sink(string|resource $to)
* @method \Illuminate\Http\Client\PendingRequest stub(callable $callback)
* @method \Illuminate\Http\Client\PendingRequest timeout(int $seconds)
Expand Down
13 changes: 11 additions & 2 deletions src/Illuminate/Http/Client/PendingRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,13 @@ class PendingRequest
*/
protected $retryDelay = 100;

/**
* Whether to throw an exception when all retries fail.
*
* @var bool
*/
protected $retryThrow = true;

/**
* The callback that will determine if the request should be retried.
*
Expand Down Expand Up @@ -451,12 +458,14 @@ public function timeout(int $seconds)
* @param int $times
* @param int $sleep
* @param callable|null $when
* @param bool $throw
* @return $this
*/
public function retry(int $times, int $sleep = 0, ?callable $when = null)
public function retry(int $times, int $sleep = 0, ?callable $when = null, bool $throw = true)
{
$this->tries = $times;
$this->retryDelay = $sleep;
$this->retryThrow = $throw;
$this->retryWhenCallback = $when;

return $this;
Expand Down Expand Up @@ -679,7 +688,7 @@ public function send(string $method, string $url, array $options = [])
return tap(new Response($this->sendRequest($method, $url, $options)), function ($response) {
$this->populateResponse($response);

if ($this->tries > 1 && ! $response->successful()) {
if ($this->tries > 1 && $this->retryThrow && ! $response->successful()) {
$response->throw();
}

Expand Down
26 changes: 26 additions & 0 deletions tests/Http/HttpClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1050,4 +1050,30 @@ public function testRequestIsMacroable()

$this->factory->get('https://example.com');
}

public function testRequestExceptionIsThrownWhenRetriesExhausted()
{
$this->expectException(RequestException::class);

$this->factory->fake([
'*' => $this->factory->response(['error'], 403),
]);

$this->factory
->retry(2, 1000, null, true)
->get('http://foo.com/get');
}

public function testRequestExceptionIsNotThrownWhenDisabledAndRetriesExhausted()
{
$this->factory->fake([
'*' => $this->factory->response(['error'], 403),
]);

$response = $this->factory
->retry(2, 1000, null, false)
->get('http://foo.com/get');

$this->assertTrue($response->failed());
}
}

0 comments on commit ec7045e

Please sign in to comment.