diff --git a/src/Ratchet/WebSocket/Version/Hixie76/Frame.php b/src/Ratchet/WebSocket/Version/Hixie76/Frame.php index b9af87d..c9d0ec6 100644 --- a/src/Ratchet/WebSocket/Version/Hixie76/Frame.php +++ b/src/Ratchet/WebSocket/Version/Hixie76/Frame.php @@ -75,4 +75,8 @@ class Frame implements FrameInterface { return substr($this->_data, 1, strlen($this->_data) - 2); } + + public function extractOverflow() { + return ''; + } } \ No newline at end of file diff --git a/src/Ratchet/WebSocket/Version/RFC6455/Frame.php b/src/Ratchet/WebSocket/Version/RFC6455/Frame.php index 60c8a2f..f8dc826 100644 --- a/src/Ratchet/WebSocket/Version/RFC6455/Frame.php +++ b/src/Ratchet/WebSocket/Version/RFC6455/Frame.php @@ -38,7 +38,7 @@ class Frame implements FrameInterface { return false; } - return $payload_length + $payload_start === $this->_bytes_rec; + return $this->_bytes_rec >= $payload_length + $payload_start; } /** @@ -223,4 +223,26 @@ class Frame implements FrameInterface { return $payload; } + + /** + * Sometimes clients will concatinate more than one frame over the wire + * This method will take the extra bytes off the end and return them + * @todo Consider returning new Frame + * @return string + */ + public function extractOverflow() { + if ($this->isCoalesced()) { + $endPoint = $this->getPayloadLength(); + $endPoint += $this->getPayloadStartingByte(); + + if ($this->_bytes_rec > $endPoint) { + $overflow = substr($this->_data, $endPoint); + $this->_data = substr($this->_data, 0, $endPoint); + + return $overflow; + } + } + + return ''; + } } \ No newline at end of file diff --git a/src/Ratchet/WebSocket/WsServer.php b/src/Ratchet/WebSocket/WsServer.php index b69119c..951a4d8 100644 --- a/src/Ratchet/WebSocket/WsServer.php +++ b/src/Ratchet/WebSocket/WsServer.php @@ -122,7 +122,10 @@ class WsServer implements MessageComponentInterface { // Control frames (ping, pong, close) can be sent in between a fragmented message $from->WebSocket->message->addFrame($from->WebSocket->frame); + $nextFrame = $from->WebSocket->version->newFrame(); + $nextFrame->addBuffer($from->WebSocket->frame->extractOverflow()); unset($from->WebSocket->frame); + $from->WebSocket->frame = $nextFrame; } if ($from->WebSocket->message->isCoalesced()) {