|
4 | 4 |
|
5 | 5 | use Clue\React\Block; |
6 | 6 | use React\EventLoop\Factory; |
| 7 | +use React\Promise\Deferred; |
7 | 8 | use React\Socket\ConnectionInterface; |
8 | 9 | use React\Socket\Connector; |
9 | 10 | use React\Socket\ConnectorInterface; |
@@ -127,6 +128,43 @@ public function connectionToRemoteTCP6ServerShouldResultInOurIP() |
127 | 128 | $this->assertSame($ip, filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6), $ip); |
128 | 129 | } |
129 | 130 |
|
| 131 | + public function testCancelPendingTlsConnectionDuringTlsHandshakeShouldCloseTcpConnectionToServer() |
| 132 | + { |
| 133 | + if (defined('HHVM_VERSION')) { |
| 134 | + $this->markTestSkipped('Not supported on legacy HHVM'); |
| 135 | + } |
| 136 | + |
| 137 | + $loop = Factory::create(); |
| 138 | + |
| 139 | + $server = new TcpServer(0, $loop); |
| 140 | + $uri = str_replace('tcp://', '', $server->getAddress()); |
| 141 | + |
| 142 | + $connector = new Connector($loop); |
| 143 | + $promise = $connector->connect('tls://' . $uri); |
| 144 | + |
| 145 | + $deferred = new Deferred(); |
| 146 | + $server->on('connection', function (ConnectionInterface $connection) use ($promise, $deferred, $loop) { |
| 147 | + $connection->on('close', function () use ($deferred) { |
| 148 | + $deferred->resolve(); |
| 149 | + }); |
| 150 | + |
| 151 | + $loop->futureTick(function () use ($promise) { |
| 152 | + $promise->cancel(); |
| 153 | + }); |
| 154 | + }); |
| 155 | + |
| 156 | + Block\await($deferred->promise(), $loop, self::TIMEOUT); |
| 157 | + $server->close(); |
| 158 | + |
| 159 | + try { |
| 160 | + Block\await($promise, $loop, self::TIMEOUT); |
| 161 | + $this->fail(); |
| 162 | + } catch (\Exception $e) { |
| 163 | + $this->assertInstanceOf('RuntimeException', $e); |
| 164 | + $this->assertEquals('Connection to ' . $uri . ' cancelled during TLS handshake', $e->getMessage()); |
| 165 | + } |
| 166 | + } |
| 167 | + |
130 | 168 | /** |
131 | 169 | * @internal |
132 | 170 | */ |
|
0 commit comments