A little faster by not using Frame functions to test for frame sizes

This commit is contained in:
Matt Bonneau 2019-12-10 22:23:00 -05:00
parent 58e79971e0
commit 11a21b7628

View File

@ -65,44 +65,40 @@ class MessageBuffer {
public function onData($data) { public function onData($data) {
$data = $this->leftovers . $data; $data = $this->leftovers . $data;
$dataLen = strlen($data); $dataLen = strlen($data);
$spyFrame = new Frame();
if ($dataLen < 2) { if ($dataLen < 2) {
$this->leftovers = $data; $this->leftovers = $data;
return; return;
} }
$currentByte = 0;
$frameStart = 0;
$spyFrame->addBuffer($data[$currentByte]);
$currentByte++;
while ($currentByte < $dataLen) { $frameStart = 0;
$spyFrame->addBuffer($data[$currentByte]); while ($frameStart + 1 <= $dataLen) {
$currentByte ++; $headerSize = 2;
try { $payload_length = unpack('C', $data[$frameStart + 1] & "\x7f")[1];
$payload_length = $spyFrame->getPayloadLength(); $isMasked = ($data[$frameStart + 1] & "\x80") === "\x80";
$payload_start = $spyFrame->getPayloadStartingByte(); $headerSize += $isMasked ? 4 : 0;
} catch (\UnderflowException $e) { if ($payload_length > 125 && ($dataLen - $frameStart < $headerSize + 125)) {
if ($currentByte < $dataLen) { // no point of checking - this frame is going to be bigger than the buffer is right now
continue;
}
break; break;
} }
if ($payload_length > 125) {
$payloadLenBytes = $payload_length === 126 ? 2 : 8;
$headerSize += $payloadLenBytes;
$bytesToUpack = substr($data, $frameStart + 2, $payloadLenBytes);
$payload_length = $payload_length === 126
? unpack('n', $bytesToUpack)[1]
: unpack('J', $bytesToUpack)[1];
}
$isCoalesced = $dataLen - $frameStart >= $payload_length + $payload_start; $isCoalesced = $dataLen - $frameStart >= $payload_length + $headerSize;
if (!$isCoalesced) { if (!$isCoalesced) {
break; break;
} }
$this->processData(substr($data, $frameStart, $payload_length + $payload_start)); $this->processData(substr($data, $frameStart, $payload_length + $headerSize));
$spyFrame = new Frame(); $frameStart = $frameStart + $payload_length + $headerSize;
$currentByte = $frameStart + $payload_length + $payload_start;
$frameStart = $currentByte;
} }
$this->leftovers = substr($data, $frameStart); $this->leftovers = substr($data, $frameStart);
} }
/** /**