Skip to content

Commit 7c19376

Browse files
committed
Fix WebSocketClient
1 parent 5c1babf commit 7c19376

File tree

1 file changed

+91
-8
lines changed

1 file changed

+91
-8
lines changed

lib/Wrench/Protocol/Protocol.php

Lines changed: 91 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public function getRequestHandshake(
295295
throw new InvalidArgumentException('You must supply a URI, key and origin');
296296
}
297297

298-
list($host, $port, $path) = self::validateUri($uri);
298+
list($scheme, $host, $port, $path) = self::validateUri($uri);
299299

300300
$handshake = array(
301301
sprintf(self::REQUEST_LINE_FORMAT, $path)
@@ -311,7 +311,6 @@ public function getRequestHandshake(
311311
foreach ($headers as $name => $value) {
312312
$handshake[] = sprintf(self::HEADER_LINE_FORMAT, $name, $value);
313313
}
314-
315314
return implode($handshake, "\r\n") . "\r\n\r\n";
316315
}
317316

@@ -662,13 +661,11 @@ protected function getHeaders($response, &$request_line = null)
662661
$return = array();
663662
foreach (explode("\r\n", $headers) as $header) {
664663
$parts = explode(': ', $header, 2);
665-
666-
if (count($parts) != 2) {
667-
throw new InvalidArgumentException('Invalid header');
664+
if (count($parts) == 2) {
665+
list($name, $value) = $parts;
666+
$return[$name] = $value;
668667
}
669668

670-
list($name, $value) = $parts;
671-
$return[$name] = $value;
672669
}
673670

674671
return $return;
@@ -735,7 +732,7 @@ protected function getDefaultRequestHeaders($host, $key, $origin)
735732
self::HEADER_HOST => $host,
736733
self::HEADER_UPGRADE => self::UPGRADE_VALUE,
737734
self::HEADER_CONNECTION => self::CONNECTION_VALUE,
738-
self::HEADER_KEY => $this->encodeKey($key),
735+
self::HEADER_KEY => $key, //$this->encodeKey($key),
739736
self::HEADER_ORIGIN => $origin,
740737
self::HEADER_VERSION => $this->getVersion()
741738
);
@@ -779,4 +776,90 @@ protected function getPort($scheme)
779776
throw new InvalidArgumentException('Unknown websocket scheme');
780777
}
781778
}
779+
780+
public function encode($payload, $type = 'text', $masked = true)
781+
{
782+
$frameHead = array();
783+
$frame = '';
784+
$payloadLength = strlen($payload);
785+
786+
switch($type)
787+
{
788+
case 'text':
789+
// first byte indicates FIN, Text-Frame (10000001):
790+
$frameHead[0] = 129;
791+
break;
792+
793+
case 'close':
794+
// first byte indicates FIN, Close Frame(10001000):
795+
$frameHead[0] = 136;
796+
break;
797+
798+
case 'ping':
799+
// first byte indicates FIN, Ping frame (10001001):
800+
$frameHead[0] = 137;
801+
break;
802+
803+
case 'pong':
804+
// first byte indicates FIN, Pong frame (10001010):
805+
$frameHead[0] = 138;
806+
break;
807+
}
808+
809+
// set mask and payload length (using 1, 3 or 9 bytes)
810+
if($payloadLength > 65535)
811+
{
812+
$payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
813+
$frameHead[1] = ($masked === true) ? 255 : 127;
814+
for($i = 0; $i < 8; $i++)
815+
{
816+
$frameHead[$i+2] = bindec($payloadLengthBin[$i]);
817+
}
818+
// most significant bit MUST be 0 (close connection if frame too big)
819+
if($frameHead[2] > 127)
820+
{
821+
$this->close(1004);
822+
return false;
823+
}
824+
}
825+
elseif($payloadLength > 125)
826+
{
827+
$payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
828+
$frameHead[1] = ($masked === true) ? 254 : 126;
829+
$frameHead[2] = bindec($payloadLengthBin[0]);
830+
$frameHead[3] = bindec($payloadLengthBin[1]);
831+
}
832+
else
833+
{
834+
$frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
835+
}
836+
837+
// convert frame-head to string:
838+
foreach(array_keys($frameHead) as $i)
839+
{
840+
$frameHead[$i] = chr($frameHead[$i]);
841+
}
842+
if($masked === true)
843+
{
844+
// generate a random mask:
845+
$mask = array();
846+
for($i = 0; $i < 4; $i++)
847+
{
848+
$mask[$i] = chr(rand(0, 255));
849+
}
850+
851+
$frameHead = array_merge($frameHead, $mask);
852+
}
853+
$frame = implode('', $frameHead);
854+
855+
// append payload to frame:
856+
$framePayload = array();
857+
for($i = 0; $i < $payloadLength; $i++)
858+
{
859+
$frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
860+
}
861+
862+
return $frame;
863+
}
864+
782865
}

0 commit comments

Comments
 (0)