[WebSocket] Refactor
Fixing bugs in hixieeeeeeee
This commit is contained in:
parent
c6a801f1ef
commit
f6fef1a390
@ -34,7 +34,10 @@ class Hixie76 implements VersionInterface {
|
|||||||
, 'Sec-WebSocket-Location' => 'ws://' . $request->getHeader('Host') . $request->getPath()
|
, 'Sec-WebSocket-Location' => 'ws://' . $request->getHeader('Host') . $request->getPath()
|
||||||
);
|
);
|
||||||
|
|
||||||
return new \Guzzle\Http\Message\Response('101', $headers, $body);
|
$response = new \Guzzle\Http\Message\Response('101', $headers, $body);
|
||||||
|
$response->setStatus('101', 'WebSocket Protocol Handshake');
|
||||||
|
|
||||||
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function newMessage() {
|
public function newMessage() {
|
||||||
|
@ -40,13 +40,9 @@ class RFC6455 implements VersionInterface {
|
|||||||
, 'Connection' => 'Upgrade'
|
, 'Connection' => 'Upgrade'
|
||||||
, 'Sec-WebSocket-Accept' => $this->sign($request->getHeader('Sec-WebSocket-Key'))
|
, 'Sec-WebSocket-Accept' => $this->sign($request->getHeader('Sec-WebSocket-Key'))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return new \Guzzle\Http\Message\Response('101', $headers);
|
||||||
$response = new \Guzzle\Http\Message\Response(101, $headers);
|
}
|
||||||
return $response;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return RFC6455\Message
|
* @return RFC6455\Message
|
||||||
@ -81,8 +77,8 @@ class RFC6455 implements VersionInterface {
|
|||||||
switch($type) {
|
switch($type) {
|
||||||
case 'text':
|
case 'text':
|
||||||
// first byte indicates FIN, Text-Frame (10000001):
|
// first byte indicates FIN, Text-Frame (10000001):
|
||||||
$frameHead[0] = 129;
|
$frameHead[0] = 129;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'close':
|
case 'close':
|
||||||
// first byte indicates FIN, Close Frame(10001000):
|
// first byte indicates FIN, Close Frame(10001000):
|
||||||
@ -100,7 +96,7 @@ class RFC6455 implements VersionInterface {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set mask and payload length (using 1, 3 or 9 bytes)
|
// set mask and payload length (using 1, 3 or 9 bytes)
|
||||||
if($payloadLength > 65535) {
|
if($payloadLength > 65535) {
|
||||||
$payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
|
$payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
|
||||||
$frameHead[1] = ($masked === true) ? 255 : 127;
|
$frameHead[1] = ($masked === true) ? 255 : 127;
|
||||||
@ -131,13 +127,13 @@ class RFC6455 implements VersionInterface {
|
|||||||
$mask[$i] = chr(rand(0, 255));
|
$mask[$i] = chr(rand(0, 255));
|
||||||
}
|
}
|
||||||
|
|
||||||
$frameHead = array_merge($frameHead, $mask);
|
$frameHead = array_merge($frameHead, $mask);
|
||||||
}
|
}
|
||||||
$frame = implode('', $frameHead);
|
$frame = implode('', $frameHead);
|
||||||
|
|
||||||
// append payload to frame:
|
// append payload to frame:
|
||||||
$framePayload = array();
|
$framePayload = array();
|
||||||
for($i = 0; $i < $payloadLength; $i++) {
|
for($i = 0; $i < $payloadLength; $i++) {
|
||||||
$frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
|
$frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,28 +78,22 @@ class WebSocketComponent implements MessageComponentInterface {
|
|||||||
|
|
||||||
$response = $from->WebSocket->version->handshake($from->WebSocket->headers);
|
$response = $from->WebSocket->version->handshake($from->WebSocket->headers);
|
||||||
$from->WebSocket->handshake = true;
|
$from->WebSocket->handshake = true;
|
||||||
|
|
||||||
|
// This block is to be moved/changed later
|
||||||
|
|
||||||
// This block is to be moved/changed later
|
|
||||||
|
|
||||||
$agreed_protocols = array();
|
$agreed_protocols = array();
|
||||||
|
|
||||||
$requested_protocols = $from->WebSocket->headers->getTokenizedHeader('Sec-WebSocket-Protocol', ',');
|
$requested_protocols = $from->WebSocket->headers->getTokenizedHeader('Sec-WebSocket-Protocol', ',');
|
||||||
|
|
||||||
foreach ($this->accepted_subprotocols as $sub_protocol) {
|
foreach ($this->accepted_subprotocols as $sub_protocol) {
|
||||||
if (false !== $requested_protocols->hasValue($sub_protocol)) {
|
if (null !== $requested_protocols && false !== $requested_protocols->hasValue($sub_protocol)) {
|
||||||
$agreed_protocols[] = $sub_protocol;
|
$agreed_protocols[] = $sub_protocol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($agreed_protocols) > 0) {
|
if (count($agreed_protocols) > 0) {
|
||||||
|
|
||||||
// $response['Sec-WebSocket-Protocol'] = implode(',', $agreed_protocols);
|
|
||||||
$response->setHeader('Sec-WebSocket-Protocol', implode(',', $agreed_protocols));
|
$response->setHeader('Sec-WebSocket-Protocol', implode(',', $agreed_protocols));
|
||||||
}
|
}
|
||||||
$header = (string)$response;
|
$header = (string)$response;
|
||||||
|
|
||||||
$comp = $this->_factory->newComposite();
|
$comp = $this->_factory->newComposite();
|
||||||
$comp->enqueue($this->_factory->newCommand('SendMessage', $from)->setMessage($header));
|
$comp->enqueue($this->_factory->newCommand('SendMessage', $from)->setMessage($header));
|
||||||
$comp->enqueue($this->prepareCommand($this->_decorating->onOpen($from, $msg))); // Need to send headers/handshake to application, let it have the cookies, etc
|
$comp->enqueue($this->prepareCommand($this->_decorating->onOpen($from, $msg))); // Need to send headers/handshake to application, let it have the cookies, etc
|
||||||
@ -176,7 +170,7 @@ class WebSocketComponent implements MessageComponentInterface {
|
|||||||
$hash = md5($command->getMessage()) . '-' . spl_object_hash($version);
|
$hash = md5($command->getMessage()) . '-' . spl_object_hash($version);
|
||||||
|
|
||||||
if (!isset($cache[$hash])) {
|
if (!isset($cache[$hash])) {
|
||||||
$cache[$hash] = $version->frame($command->getMessage(), $this->_mask_payload);
|
$cache[$hash] = $version->frame($command->getMessage(), $this->_mask_payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $command->setMessage($cache[$hash]);
|
return $command->setMessage($cache[$hash]);
|
||||||
|
Loading…
Reference in New Issue
Block a user