rfc6455/src/Messaging/Message.php
Matt Bonneau 1af7e998b3 Merge branch 'master' into permessage-deflate
# Conflicts:
#	src/Messaging/MessageBuffer.php
#	tests/ab/clientRunner.php
#	tests/ab/run_ab_tests.sh
#	tests/ab/startServer.php
2020-01-22 00:36:05 -05:00

133 lines
2.8 KiB
PHP

<?php
namespace Ratchet\RFC6455\Messaging;
class Message implements \IteratorAggregate, MessageInterface {
/**
* @var \SplDoublyLinkedList
*/
private $_frames;
/**
* @var int
*/
private $len;
public function __construct() {
$this->_frames = new \SplDoublyLinkedList;
$this->len = 0;
}
public function getIterator() {
return $this->_frames;
}
/**
* {@inheritdoc}
*/
public function count() {
return count($this->_frames);
}
/**
* {@inheritdoc}
*/
public function isCoalesced() {
if (count($this->_frames) == 0) {
return false;
}
$last = $this->_frames->top();
return ($last->isCoalesced() && $last->isFinal());
}
/**
* {@inheritdoc}
*/
public function addFrame(FrameInterface $fragment) {
$this->len += $fragment->getPayloadLength();
$this->_frames->push($fragment);
return $this;
}
/**
* {@inheritdoc}
*/
public function getOpcode() {
if (count($this->_frames) == 0) {
throw new \UnderflowException('No frames have been added to this message');
}
return $this->_frames->bottom()->getOpcode();
}
/**
* {@inheritdoc}
*/
public function getPayloadLength() {
return $this->len;
}
/**
* {@inheritdoc}
*/
public function getPayload() {
if (!$this->isCoalesced()) {
throw new \UnderflowException('Message has not been put back together yet');
}
return $this->__toString();
}
/**
* {@inheritdoc}
*/
public function getContents() {
if (!$this->isCoalesced()) {
throw new \UnderflowException("Message has not been put back together yet");
}
$buffer = '';
foreach ($this->_frames as $frame) {
$buffer .= $frame->getContents();
}
return $buffer;
}
public function __toString() {
$buffer = '';
foreach ($this->_frames as $frame) {
$buffer .= $frame->getPayload();
}
return $buffer;
}
/**
* @return boolean
*/
public function isBinary() {
if ($this->_frames->isEmpty()) {
throw new \UnderflowException('Not enough data has been received to determine if message is binary');
}
return Frame::OP_BINARY === $this->_frames->bottom()->getOpcode();
}
/**
* @return boolean
*/
public function getRsv1() {
if ($this->_frames->isEmpty()) {
return false;
//throw new \UnderflowException('Not enough data has been received to determine if message is binary');
}
return $this->_frames->bottom()->getRsv1();
}
}