private function onParsedControlFrame(Rfc6455Client $client, array $parseResult)
{
// something went that wrong that we had to shutdown our readWatcher... if parser has anything left, we don't care!
if (!$client->readWatcher) {
return;
}
list($data, $opcode) = $parseResult;
switch ($opcode) {
case self::OP_CLOSE:
if ($client->closedAt) {
unset($this->closeTimeouts[$client->id]);
$this->unloadClient($client);
} else {
if (\strlen($data) < 2) {
return;
// invalid close reason
}
$code = current(unpack('S', substr($data, 0, 2)));
$reason = substr($data, 2);
@stream_socket_shutdown($client->socket, STREAM_SHUT_RD);
\Amp\cancel($client->readWatcher);
$client->readWatcher = null;
resolve($this->doClose($client, $code, $reason));
}
break;
case self::OP_PING:
$this->compile($client, $data, self::OP_PONG);
break;
case self::OP_PONG:
// We need a min() here, else someone might just send a pong frame with a very high pong count and leave TCP connection in open state... Then we'd accumulate connections which never are cleaned up...
$client->pongCount = min($client->pingCount, $data);
break;
}
}