Skip to content

Commit 284d72d

Browse files
authored
Merge pull request #241 from clue-labs/cancel-tls
Fix closing connection when cancelling during TLS handshake
2 parents 842dcd7 + d9c0f07 commit 284d72d

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/StreamEncryption.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ public function toggle(Connection $stream, $toggle)
5757
// TODO: add write() event to make sure we're not sending any excessive data
5858

5959
// cancelling this leaves this stream in an inconsistent state…
60-
$deferred = new Deferred();
60+
$deferred = new Deferred(function () {
61+
throw new \RuntimeException();
62+
});
6163

6264
// get actual stream socket from stream instance
6365
$socket = $stream->stream;

tests/FunctionalConnectorTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Clue\React\Block;
66
use React\EventLoop\Factory;
7+
use React\Promise\Deferred;
78
use React\Socket\ConnectionInterface;
89
use React\Socket\Connector;
910
use React\Socket\ConnectorInterface;
@@ -127,6 +128,43 @@ public function connectionToRemoteTCP6ServerShouldResultInOurIP()
127128
$this->assertSame($ip, filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6), $ip);
128129
}
129130

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+
130168
/**
131169
* @internal
132170
*/

0 commit comments

Comments
 (0)