Merge branch 'frame-boundry'

This commit is contained in:
Chris Boden 2015-05-26 08:41:06 -04:00
commit 2e7d736bac
2 changed files with 41 additions and 0 deletions

View File

@ -379,6 +379,7 @@ class Frame implements FrameInterface {
$byte_length = $this->getNumPayloadBytes(); $byte_length = $this->getNumPayloadBytes();
if ($this->bytesRecvd < 1 + $byte_length) { if ($this->bytesRecvd < 1 + $byte_length) {
$this->defPayLen = -1;
throw new \UnderflowException('Not enough data buffered to determine payload length'); throw new \UnderflowException('Not enough data buffered to determine payload length');
} }

View File

@ -500,4 +500,44 @@ class FrameTest extends \PHPUnit_Framework_TestCase {
return $randomString; return $randomString;
} }
/**
* There was a frame boundary issue when the first 3 bytes of a frame with a payload greater than
* 126 was added to the frame buffer and then Frame::getPayloadLength was called. It would cause the frame
* to set the payload length to 126 and then not recalculate it once the full length information was available.
*
* This is fixed by setting the defPayLen back to -1 before the underflow exception is thrown.
*
* @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayloadLength
* @covers Ratchet\WebSocket\Version\RFC6455\Frame::extractOverflow
*/
public function testFrameDeliveredOneByteAtATime() {
$startHeader = "\x01\x7e\x01\x00"; // header for a text frame of 256 - non-final
$framePayload = str_repeat("*", 256);
$rawOverflow = "xyz";
$rawFrame = $startHeader . $framePayload . $rawOverflow;
$frame = new Frame();
$payloadLen = 256;
for ($i = 0; $i < strlen($rawFrame); $i++) {
$frame->addBuffer($rawFrame[$i]);
try {
// payloadLen will
$payloadLen = $frame->getPayloadLength();
} catch (\UnderflowException $e) {
if ($i > 2) { // we should get an underflow on 0,1,2
$this->fail("Underflow exception when the frame length should be available");
}
}
if ($payloadLen !== 256) {
$this->fail("Payload length of " . $payloadLen . " should have been 256.");
}
}
// make sure the overflow is good
$this->assertEquals($rawOverflow, $frame->extractOverflow());
}
} }