Refactoring

Removed WebSocket unframing code that was refactored in previous commits
Added ability to configure buffer size on socket server
This commit is contained in:
Chris Boden 2011-11-19 17:18:48 -05:00
parent 7e2d933f53
commit 923b936e42
4 changed files with 17 additions and 123 deletions

View File

@ -27,8 +27,12 @@ class App implements ApplicationInterface {
protected $_app;
/**
* @param Ratchet\Application\ApplicationInterface
* Number of bytes to read in the TCP buffer at a time
* Default is (currently) 4kb
* @var int
*/
protected $_buffer_size = 4096;
public function __construct(ApplicationInterface $application = null) {
if (null === $application) {
throw new \UnexpectedValueException("Server requires an application to run off of");
@ -37,6 +41,14 @@ class App implements ApplicationInterface {
$this->_app = $application;
}
public function setBufferSize($recv_bytes) {
if ((int)$recv_bytes < 1) {
throw new \InvalidArgumentException('Invalid number of bytes set, must be more than 0');
}
$this->_buffer_size = (int)$recv_bytes;
}
/*
* @param Ratchet\SocketInterface
* @param mixed The address to listen for incoming connections on. "0.0.0.0" to listen from anywhere
@ -63,7 +75,7 @@ class App implements ApplicationInterface {
} while (true);
}
protected function loop(SocketInterface $host, $recv_bytes = 1024) {
protected function loop(SocketInterface $host) {
$changed = $this->_resources;
try {
@ -81,7 +93,7 @@ class App implements ApplicationInterface {
$res = $this->onOpen($conn);
} else {
$data = $buf = '';
$bytes = $conn->getSocket()->recv($buf, $recv_bytes, 0);
$bytes = $conn->getSocket()->recv($buf, $this->_buffer_size, 0);
if ($bytes > 0) {
$data = $buf;

View File

@ -49,10 +49,6 @@ class Hixie76 implements VersionInterface {
return new Hixie76\Frame;
}
public function unframe($message) {
return substr($message, 1, strlen($message) - 2);
}
public function frame($message) {
return chr(0) . $message . chr(255);
}

View File

@ -41,113 +41,6 @@ class HyBi10 implements VersionInterface {
return new HyBi10\Frame;
}
/**
* Unframe a message received from the client
* Thanks to @lemmingzshadow for the code on decoding a HyBi-10 frame
* @link https://github.com/lemmingzshadow/php-websocket
* @param string
* @return array
* @throws UnexpectedValueException
* @todo return a common interface instead of array
*/
public function unframe($message) {
$data = $message;
$mask = $payloadLength = $unmaskedPayload = '';
$decodedData = array();
// estimate frame type:
$firstByteBinary = sprintf('%08b', ord($data[0]));
$finIndicator = bindec(substr($firstByteBinary, 0, 1));
$opcode = bindec(substr($firstByteBinary, 4, 4));
$secondByteBinary = sprintf('%08b', ord($data[1]));
$isMasked = ($secondByteBinary[0] == '1') ? true : false;
$payloadLength = ord($data[1]) & 127;
// close connection if unmasked frame is received:
if($isMasked === false) {
throw new \UnexpectedValueException('Masked byte is false');
}
switch($opcode) {
// continuation frame
case 0:
throw new \UnexpectedValueException("Opcode CONTINUATION not accepted yet");
$decodedData['type'] = 'text'; // incomplete
break;
// text frame:
case 1:
$decodedData['type'] = 'text';
break;
// binary data frame
case 2:
throw new \UnexpectedValueException("Opcode BINARY not accepted yet");
$decodedData['type'] = 'binary';
break;
// connection close frame:
case 8:
throw new \UnexpectedValueException("Opcode CLOSE not accepted yet");
$decodedData['type'] = 'close';
break;
// ping frame:
case 9:
throw new \UnexpectedValueException("Opcode PING not accepted yet");
$decodedData['type'] = 'ping';
break;
// pong frame:
case 10:
throw new \UnexpectedValueException("Opcode PONG not accepted yet");
$decodedData['type'] = 'pong';
break;
default:
// Close connection on unknown opcode:
throw new \UnexpectedValueException("Unknown opcode ({$opcode})");
break;
}
if($payloadLength === 126) {
$msg_len = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3])));
$mask = substr($data, 4, 4);
$payloadOffset = 8;
} elseif($payloadLength === 127) {
$msg_len = bindec(
sprintf('%08b', ord($data[2]))
. sprintf('%08b', ord($data[3]))
. sprintf('%08b', ord($data[4]))
. sprintf('%08b', ord($data[5]))
. sprintf('%08b', ord($data[6]))
. sprintf('%08b', ord($data[7]))
. sprintf('%08b', ord($data[8]))
. sprintf('%08b', ord($data[9]))
);
$mask = substr($data, 10, 4);
$payloadOffset = 14;
} else {
$msg_len = $payloadLength;
$mask = substr($data, 2, 4);
$payloadOffset = 6;
}
$dataLength = strlen($data);
if($isMasked === true) { // This will always pass...
for($i = $payloadOffset; $i < $dataLength; $i++) {
$j = $i - $payloadOffset;
$unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
}
$decodedData['payload'] = $unmaskedPayload;
}
return $decodedData;
}
/**
* Thanks to @lemmingzshadow for the code on decoding a HyBi-10 frame
* @link https://github.com/lemmingzshadow/php-websocket

View File

@ -4,6 +4,8 @@ namespace Ratchet\Application\WebSocket\Version;
/**
* Despite the version iterations of WebInterface the actions they go through are similar
* This standardizes how the server handles communication with each protocol version
* @todo Need better naming conventions...newMessage and newFrame are for reading incoming framed messages (action is unframing)
* The current method names suggest you could create a new message/frame to send, which they can not do
*/
interface VersionInterface {
/**
@ -23,15 +25,6 @@ interface VersionInterface {
*/
function newFrame();
/**
* Get a framed message as per the protocol and return the decoded message
* @param string
* @return string
* @todo Return a frame object with message, type, masked?
* @deprecated
*/
function unframe($message);
/**
* @param string
* @return string