A little faster by not using Frame functions to test for frame sizes
This commit is contained in:
parent
58e79971e0
commit
11a21b7628
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user