Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Forward compatibility with upcoming Promise v3
  • Loading branch information
clue committed Sep 2, 2022
commit 8ec53f525b7fcfe66cc14007415346458d63f1f8
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ jobs:
with:
php-version: ${{ matrix.php }}
coverage: xdebug
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: composer install
- run: vendor/bin/phpunit --coverage-text
if: ${{ matrix.php >= 7.3 }}
Expand All @@ -39,6 +41,7 @@ jobs:
name: PHPUnit (HHVM)
runs-on: ubuntu-18.04
continue-on-error: true
if: false # temporarily skipped until https://github.com/azjezz/setup-hhvm/issues/3 is addressed
steps:
- uses: actions/checkout@v2
- uses: azjezz/setup-hhvm@v1
Expand Down
28 changes: 21 additions & 7 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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@dev || ^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": "dev-promise-v3 as 1.8.0",
"clue/reactphp-ssh-proxy": "dev-promise-v3 as 1.4.0",
"clue/socks-react": "dev-promise-v3 as 1.4.0",
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
"react/async": "^4 || ^3 || ^2",
"react/promise-timer": "^1.9"
Expand All @@ -50,5 +50,19 @@
},
"autoload-dev": {
"psr-4": { "React\\Tests\\Http\\": "tests" }
}
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/clue-labs/reactphp-http-proxy"
},
{
"type": "vcs",
"url": "https://github.com/clue-labs/reactphp-socks"
},
{
"type": "vcs",
"url": "https://github.com/clue-labs/reactphp-ssh-proxy"
}
]
}
3 changes: 1 addition & 2 deletions src/Io/StreamingServer.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
});
Expand Down
2 changes: 1 addition & 1 deletion src/Middleware/LimitConcurrentRequestsMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,6 @@ public function processQueue()
$first = \reset($this->queue);
unset($this->queue[key($this->queue)]);

$first->resolve();
$first->resolve(null);
}
}
4 changes: 4 additions & 0 deletions tests/FunctionalHttpServerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
3 changes: 1 addition & 2 deletions tests/Io/MiddlewareRunnerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
}
14 changes: 10 additions & 4 deletions tests/Io/TransactionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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();
}

Expand Down
8 changes: 4 additions & 4 deletions tests/Middleware/LimitConcurrentRequestsMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public function testLimitOneRequestConcurrently()
/**
* Ensure resolve frees up a slot
*/
$deferredA->resolve();
$deferredA->resolve(null);

$this->assertTrue($calledA);
$this->assertTrue($calledB);
Expand All @@ -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);
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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);
Expand Down