diff --git a/composer.json b/composer.json index 57adfc2c..d92ac820 100644 --- a/composer.json +++ b/composer.json @@ -31,16 +31,16 @@ "fig/http-message-util": "^1.1", "psr/http-message": "^1.0", "react/event-loop": "^1.2", - "react/promise": "^2.3 || ^1.2.1", - "react/promise-stream": "^1.1", - "react/socket": "^1.9", + "react/promise": "^3 || ^2.3 || ^1.2.1", + "react/promise-stream": "^1.4", + "react/socket": "^1.12", "react/stream": "^1.2", "ringcentral/psr7": "^1.2" }, "require-dev": { - "clue/http-proxy-react": "^1.7", - "clue/reactphp-ssh-proxy": "^1.3", - "clue/socks-react": "^1.3", + "clue/http-proxy-react": "^1.8", + "clue/reactphp-ssh-proxy": "^1.4", + "clue/socks-react": "^1.4", "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", "react/async": "^4 || ^3 || ^2", "react/promise-timer": "^1.9" diff --git a/src/Io/StreamingServer.php b/src/Io/StreamingServer.php index a054be3d..13f0b0c4 100644 --- a/src/Io/StreamingServer.php +++ b/src/Io/StreamingServer.php @@ -9,7 +9,6 @@ use React\Http\Message\Response; use React\Http\Message\ServerRequest; use React\Promise; -use React\Promise\CancellablePromiseInterface; use React\Promise\PromiseInterface; use React\Socket\ConnectionInterface; use React\Socket\ServerInterface; @@ -158,7 +157,7 @@ public function handleRequest(ConnectionInterface $conn, ServerRequestInterface } // cancel pending promise once connection closes - if ($response instanceof CancellablePromiseInterface) { + if ($response instanceof PromiseInterface && \method_exists($response, 'cancel')) { $conn->on('close', function () use ($response) { $response->cancel(); }); diff --git a/src/Middleware/LimitConcurrentRequestsMiddleware.php b/src/Middleware/LimitConcurrentRequestsMiddleware.php index 53338100..b1c00da0 100644 --- a/src/Middleware/LimitConcurrentRequestsMiddleware.php +++ b/src/Middleware/LimitConcurrentRequestsMiddleware.php @@ -206,6 +206,6 @@ public function processQueue() $first = \reset($this->queue); unset($this->queue[key($this->queue)]); - $first->resolve(); + $first->resolve(null); } } diff --git a/tests/FunctionalHttpServerTest.php b/tests/FunctionalHttpServerTest.php index eb3b448c..dcd79b3e 100644 --- a/tests/FunctionalHttpServerTest.php +++ b/tests/FunctionalHttpServerTest.php @@ -726,6 +726,10 @@ public function testConnectWithClosedThroughStreamReturnsNoData() public function testLimitConcurrentRequestsMiddlewareRequestStreamPausing() { + if (defined('HHVM_VERSION') && !interface_exists('React\Promise\PromisorInterface')) { + $this->markTestSkipped('Not supported on legacy HHVM with Promise v3'); + } + $connector = new Connector(); $http = new HttpServer( diff --git a/tests/Io/MiddlewareRunnerTest.php b/tests/Io/MiddlewareRunnerTest.php index 1f49facd..ac836f03 100644 --- a/tests/Io/MiddlewareRunnerTest.php +++ b/tests/Io/MiddlewareRunnerTest.php @@ -8,7 +8,6 @@ use React\Http\Io\MiddlewareRunner; use React\Http\Message\ServerRequest; use React\Promise; -use React\Promise\CancellablePromiseInterface; use React\Promise\PromiseInterface; use React\Tests\Http\Middleware\ProcessStack; use React\Tests\Http\TestCase; @@ -479,7 +478,7 @@ function (RequestInterface $request) use ($once) { $promise = $middleware($request); - $this->assertTrue($promise instanceof CancellablePromiseInterface); + $this->assertTrue($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')); $promise->cancel(); } } diff --git a/tests/Io/TransactionTest.php b/tests/Io/TransactionTest.php index 83d218c7..d9ac2178 100644 --- a/tests/Io/TransactionTest.php +++ b/tests/Io/TransactionTest.php @@ -436,11 +436,14 @@ public function testCancelBufferingResponseWillCloseStreamAndReject() $response = new Response(200, array(), new ReadableBodyStream($stream)); // mock sender to resolve promise with the given $response in response to the given $request + $deferred = new Deferred(); $sender = $this->makeSenderMock(); - $sender->expects($this->once())->method('send')->with($this->equalTo($request))->willReturn(Promise\resolve($response)); + $sender->expects($this->once())->method('send')->with($this->equalTo($request))->willReturn($deferred->promise()); $transaction = new Transaction($sender, Loop::get()); $promise = $transaction->send($request); + + $deferred->resolve($response); $promise->cancel(); $this->setExpectedException('RuntimeException'); @@ -778,13 +781,16 @@ public function testCancelTransactionWillCloseBufferingStream() $body = new ThroughStream(); $body->on('close', $this->expectCallableOnce()); - // mock sender to resolve promise with the given $redirectResponse in - $redirectResponse = new Response(301, array('Location' => 'http://example.com/new'), new ReadableBodyStream($body)); - $sender->expects($this->once())->method('send')->willReturn(Promise\resolve($redirectResponse)); + // mock sender to resolve promise with the given $redirectResponse + $deferred = new Deferred(); + $sender->expects($this->once())->method('send')->willReturn($deferred->promise()); $transaction = new Transaction($sender, $loop); $promise = $transaction->send($request); + $redirectResponse = new Response(301, array('Location' => 'http://example.com/new'), new ReadableBodyStream($body)); + $deferred->resolve($redirectResponse); + $promise->cancel(); } diff --git a/tests/Middleware/LimitConcurrentRequestsMiddlewareTest.php b/tests/Middleware/LimitConcurrentRequestsMiddlewareTest.php index 7e537391..6c63a94f 100644 --- a/tests/Middleware/LimitConcurrentRequestsMiddlewareTest.php +++ b/tests/Middleware/LimitConcurrentRequestsMiddlewareTest.php @@ -79,7 +79,7 @@ public function testLimitOneRequestConcurrently() /** * Ensure resolve frees up a slot */ - $deferredA->resolve(); + $deferredA->resolve(null); $this->assertTrue($calledA); $this->assertTrue($calledB); @@ -88,7 +88,7 @@ public function testLimitOneRequestConcurrently() /** * Ensure reject also frees up a slot */ - $deferredB->reject(); + $deferredB->reject(new \RuntimeException()); $this->assertTrue($calledA); $this->assertTrue($calledB); @@ -194,7 +194,7 @@ public function testStreamDoesPauseAndThenResumeWhenDequeued() $limitHandlers(new ServerRequest('GET', 'https://example.com/', array(), $body), function () {}); - $deferred->reject(); + $deferred->reject(new \RuntimeException()); } public function testReceivesBufferedRequestSameInstance() @@ -452,7 +452,7 @@ public function testReceivesStreamingBodyChangesInstanceWithCustomBodyButSameDat $req = $request; }); - $deferred->reject(); + $deferred->reject(new \RuntimeException()); $this->assertNotSame($request, $req); $this->assertInstanceOf('Psr\Http\Message\ServerRequestInterface', $req);