-
-
Notifications
You must be signed in to change notification settings - Fork 158
Open
Labels
Description
When closing a connection on a server using TLS, eg:
<?php
require __DIR__ . '/vendor/autoload.php';
$server = new React\Socket\TcpServer($port = 9900);
$server = new React\Socket\SecureServer($server, null, [
'local_cert' => 'server.pem',
'passphrase' => 'secret'
]);
$server->on('connection', function (React\Socket\ConnectionInterface $connection) {
echo '[' . $connection->getRemoteAddress() . ' connected]' . PHP_EOL;
// do stuff
$connection->end();
});
the connection is not closed properly, as
Lines 123 to 133 in e04478a
public function handleClose() | |
{ | |
if (!\is_resource($this->stream)) { | |
return; | |
} | |
// Try to cleanly shut down socket and ignore any errors in case other | |
// side already closed. Underlying Stream implementation will take care | |
// of closing stream resource, so we otherwise keep this open here. | |
@\stream_socket_shutdown($this->stream, \STREAM_SHUT_RDWR); | |
} |
uses https://www.php.net/manual/en/function.stream-socket-shutdown.php.
Note comment https://www.php.net/manual/en/function.stream-socket-shutdown.php#125659 which states tls does not get shut down properly that way.
Solution seems to be to replace @\stream_socket_shutdown($this->stream, \STREAM_SHUT_RDWR);
with \fclose($this->stream)
.
Other solution seems to be to call @\stream_socket_enable_crypto($this->stream, false);
before the socket shutdown as mentioned in comment https://www.php.net/manual/en/function.stream-socket-shutdown.php#126303