From cdb141606f6c84a399a971236303da7e3fc1522e Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Wed, 16 Feb 2022 22:36:15 +0100 Subject: [PATCH 1/5] Allow return a Promise in onRejected then --- spec/Promise/HttpRejectedPromiseSpec.php | 16 ++++++++++++++++ src/Promise/HttpRejectedPromise.php | 7 ++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/spec/Promise/HttpRejectedPromiseSpec.php b/spec/Promise/HttpRejectedPromiseSpec.php index f46dcc5..5bc3f82 100644 --- a/spec/Promise/HttpRejectedPromiseSpec.php +++ b/spec/Promise/HttpRejectedPromiseSpec.php @@ -4,6 +4,7 @@ use Http\Client\Exception; use Http\Client\Exception\TransferException; +use Http\Client\Promise\HttpFulfilledPromise; use Http\Promise\Promise; use PhpSpec\ObjectBehavior; use Prophecy\Argument; @@ -87,4 +88,19 @@ function it_throws_not_http_exception() throw new \Exception(); }); } + + function it_returns_a_promise_when_rejected(ResponseInterface $response) + { + $exception = new TransferException(); + $this->beConstructedWith($exception); + + $promise = $this->then(null, function (Exception $exceptionReceived) use($exception, $response) { + return new HttpFulfilledPromise($response->getWrappedObject()); + }); + + $promise->shouldHaveType('Http\Promise\Promise'); + $promise->shouldHaveType('Http\Client\Promise\HttpFulfilledPromise'); + $promise->getState()->shouldReturn(Promise::FULFILLED); + $promise->wait()->shouldReturnAnInstanceOf('Psr\Http\Message\ResponseInterface'); + } } diff --git a/src/Promise/HttpRejectedPromise.php b/src/Promise/HttpRejectedPromise.php index 8af97de..76a7532 100644 --- a/src/Promise/HttpRejectedPromise.php +++ b/src/Promise/HttpRejectedPromise.php @@ -4,6 +4,7 @@ use Http\Client\Exception; use Http\Promise\Promise; +use Psr\Http\Message\ResponseInterface; final class HttpRejectedPromise implements Promise { @@ -27,7 +28,11 @@ public function then(callable $onFulfilled = null, callable $onRejected = null) } try { - return new HttpFulfilledPromise($onRejected($this->exception)); + $result = $onRejected($this->exception); + if ($result instanceof Promise) { + return $result; + } + return new HttpFulfilledPromise($result); } catch (Exception $e) { return new self($e); } From c4f2c9373e6eadb48552c31470529d004062c614 Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Wed, 16 Feb 2022 23:08:52 +0100 Subject: [PATCH 2/5] Removed unused interface --- src/Promise/HttpRejectedPromise.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Promise/HttpRejectedPromise.php b/src/Promise/HttpRejectedPromise.php index 76a7532..a983bc5 100644 --- a/src/Promise/HttpRejectedPromise.php +++ b/src/Promise/HttpRejectedPromise.php @@ -4,7 +4,6 @@ use Http\Client\Exception; use Http\Promise\Promise; -use Psr\Http\Message\ResponseInterface; final class HttpRejectedPromise implements Promise { From f878059890614f8c374fed9274d7eb11421e2cce Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Thu, 17 Feb 2022 10:16:59 +0100 Subject: [PATCH 3/5] Updated CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29b03e0..dbc3798 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [2.3.0] - 2022-02-x + +### Changed + +- Enabled `HttpRejectedPromise` to return a promise for implementing a retry + mechanism [#168](https://github.com/php-http/httplug/pull/168) + ## [2.2.0] - 2020-07-13 ### Changed From cf7fc89646b44c5fa79dacc6ed79d9d84be7cad9 Mon Sep 17 00:00:00 2001 From: David Buchmann Date: Mon, 21 Feb 2022 10:36:58 +0100 Subject: [PATCH 4/5] Update src/Promise/HttpRejectedPromise.php --- src/Promise/HttpRejectedPromise.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Promise/HttpRejectedPromise.php b/src/Promise/HttpRejectedPromise.php index a983bc5..624cc8a 100644 --- a/src/Promise/HttpRejectedPromise.php +++ b/src/Promise/HttpRejectedPromise.php @@ -31,6 +31,7 @@ public function then(callable $onFulfilled = null, callable $onRejected = null) if ($result instanceof Promise) { return $result; } + return new HttpFulfilledPromise($result); } catch (Exception $e) { return new self($e); From 284eb9c92dd306d033bcad19f296b06c6411c882 Mon Sep 17 00:00:00 2001 From: David Buchmann Date: Mon, 21 Feb 2022 10:48:13 +0100 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbc3798..d59bec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed -- Enabled `HttpRejectedPromise` to return a promise for implementing a retry +- Enabled the `$onRejected` callback of `HttpRejectedPromise` to return a promise for implementing a retry mechanism [#168](https://github.com/php-http/httplug/pull/168) ## [2.2.0] - 2020-07-13