diff --git a/src/Http/Response.php b/src/Http/Response.php index ad55c7f3..fd33b784 100644 --- a/src/Http/Response.php +++ b/src/Http/Response.php @@ -364,10 +364,11 @@ public function failed(): bool { $pendingRequest = $this->getPendingRequest(); - $hasRequestFailed = $pendingRequest->getRequest()->hasRequestFailed($this) || $pendingRequest->getConnector()->hasRequestFailed($this); + $requestFailedAccordingToConnector = $pendingRequest->getConnector()->hasRequestFailed($this); + $requestFailedAccordingToRequest = $pendingRequest->getRequest()->hasRequestFailed($this); - if ($hasRequestFailed === true) { - return true; + if ($requestFailedAccordingToRequest !== null || $requestFailedAccordingToConnector !== null) { + return $requestFailedAccordingToRequest || $requestFailedAccordingToConnector; } return $this->serverError() || $this->clientError(); diff --git a/src/Http/Senders/GuzzleSender.php b/src/Http/Senders/GuzzleSender.php index bdcff039..2eadb703 100644 --- a/src/Http/Senders/GuzzleSender.php +++ b/src/Http/Senders/GuzzleSender.php @@ -172,7 +172,7 @@ function (TransferException $guzzleException) use ($pendingRequest, $psrRequest) // Throw the exception our way - throw $response->toException(); + return ($exception = $response->toException()) ? throw $exception : $response; } ); } diff --git a/tests/Feature/RequestExceptionTest.php b/tests/Feature/RequestExceptionTest.php index 768c25bb..ab773fbd 100644 --- a/tests/Feature/RequestExceptionTest.php +++ b/tests/Feature/RequestExceptionTest.php @@ -6,6 +6,7 @@ use Saloon\Http\PendingRequest; use Saloon\Http\Faking\MockClient; use Saloon\Http\Faking\MockResponse; +use GuzzleHttp\Promise\PromiseInterface; use GuzzleHttp\Exception\ServerException; use Saloon\Exceptions\Request\ClientException; use Saloon\Exceptions\Request\RequestException; @@ -14,6 +15,7 @@ use Saloon\Tests\Fixtures\Connectors\TestConnector; use Saloon\Exceptions\Request\FatalRequestException; use Saloon\Tests\Fixtures\Requests\BadResponseRequest; +use Saloon\Tests\Fixtures\Requests\NotFoundFailedRequest; use Saloon\Tests\Fixtures\Connectors\BadResponseConnector; use Saloon\Tests\Fixtures\Exceptions\CustomRequestException; use Saloon\Tests\Fixtures\Requests\CustomFailHandlerRequest; @@ -246,13 +248,57 @@ expect($responseB->failed())->toBeTrue(); }); +test('a request can mark a request as not failed', function () { + $response = TestConnector::make()->send(new NotFoundFailedRequest); + + expect($response->failed())->toBeFalse(); +}); + +test('a request can mark a request as not failed with asynchronous requests', function () { + $response = TestConnector::make()->sendAsync(new NotFoundFailedRequest)->wait(); + + expect($response->failed())->toBeFalse(); +}); + +test('a request can mark a request as not failed with pools', function () { + $responseCount = 0; + $exceptionCount = 0; + + $pool = TestConnector::make()->pool([ + new NotFoundFailedRequest, + ]); + + $pool->withResponseHandler(function (Response $response) use (&$responseCount) { + expect($response)->toBeInstanceOf(Response::class); + expect($response->status())->toBe(404); + + $responseCount++; + })->withExceptionHandler(function (RequestException $exception) use (&$exceptionCount) { + $response = $exception->getResponse(); + + expect($response)->toBeInstanceOf(Response::class); + expect($response->status())->toBe(404); + + $exceptionCount++; + }); + + $promise = $pool->send(); + + expect($promise)->toBeInstanceOf(PromiseInterface::class); + + $promise->wait(); + + expect($responseCount)->toEqual(1); + expect($exceptionCount)->toEqual(0); +}); + test('the sender will throw a FatalRequestException if it cannot connect to a site using synchronous', function (string $url) { $connector = new TestConnector($url); $request = new UserRequest(); $this->expectException(FatalRequestException::class); - $response = $connector->send($request); + $connector->send($request); })->with([ 'https://saloon.saloon.test', 'https://saloon.doesnt-exist', diff --git a/tests/Fixtures/Requests/NotFoundFailedRequest.php b/tests/Fixtures/Requests/NotFoundFailedRequest.php new file mode 100644 index 00000000..63b27f35 --- /dev/null +++ b/tests/Fixtures/Requests/NotFoundFailedRequest.php @@ -0,0 +1,40 @@ +status() === 404) { + return false; + } + + return ($response->serverError() || $response->clientError()); + } +}