diff --git a/lib/Ratchet/Application/WebSocket/App.php b/lib/Ratchet/Application/WebSocket/App.php index 8753c93..386f178 100644 --- a/lib/Ratchet/Application/WebSocket/App.php +++ b/lib/Ratchet/Application/WebSocket/App.php @@ -95,33 +95,9 @@ class App implements ApplicationInterface, ConfiguratorInterface { $response = $from->WebSocket->version->handshake($from->WebSocket->headers); $from->WebSocket->handshake = true; - - if (is_array($response)) { - // This block is to be moved/changed later - $agreed_protocols = array(); - $requested_protocols = $from->WebSocket->headers->getTokenizedHeader('Sec-WebSocket-Protocol', ','); - foreach ($this->accepted_subprotocols as $sub_protocol) { - if (false !== $requested_protocols->hasValue($sub_protocol)) { - $agreed_protocols[] = $sub_protocol; - } - } - if (count($agreed_protocols) > 0) { - $response['Sec-WebSocket-Protocol'] = implode(',', $agreed_protocols); - } - - $header = ''; - foreach ($response as $key => $val) { - if (!empty($key)) { - $header .= "{$key}: "; - } - - $header .= "{$val}\r\n"; - } - $header .= "\r\n"; - } else { - $header = $response; - } - + + $header = (string)$response; + $comp = $this->_factory->newComposite(); $comp->enqueue($this->_factory->newCommand('SendMessage', $from)->setMessage($header)); $comp->enqueue($this->prepareCommand($this->_app->onOpen($from, $msg))); // Need to send headers/handshake to application, let it have the cookies, etc diff --git a/lib/Ratchet/Application/WebSocket/Version/Hixie76.php b/lib/Ratchet/Application/WebSocket/Version/Hixie76.php index bea5578..ce5ad73 100644 --- a/lib/Ratchet/Application/WebSocket/Version/Hixie76.php +++ b/lib/Ratchet/Application/WebSocket/Version/Hixie76.php @@ -1,6 +1,7 @@ getRawHeaders() . "\r\n\r\n" . $request->getBody(); - $resource = $host = $origin = $key1 = $key2 = $protocol = $code = $handshake = null; - - preg_match('#GET (.*?) HTTP#', $buffer, $match) && $resource = $match[1]; - preg_match("#Host: (.*?)\r\n#", $buffer, $match) && $host = $match[1]; - preg_match("#Sec-WebSocket-Key1: (.*?)\r\n#", $buffer, $match) && $key1 = $match[1]; - preg_match("#Sec-WebSocket-Key2: (.*?)\r\n#", $buffer, $match) && $key2 = $match[1]; - preg_match("#Sec-WebSocket-Protocol: (.*?)\r\n#", $buffer, $match) && $protocol = $match[1]; - preg_match("#Origin: (.*?)\r\n#", $buffer, $match) && $origin = $match[1]; - preg_match("#\r\n(.*?)\$#", $buffer, $match) && $code = $match[1]; - - return "HTTP/1.1 101 WebSocket Protocol Handshake\r\n". - "Upgrade: WebSocket\r\n" - . "Connection: Upgrade\r\n" - . "Sec-WebSocket-Origin: {$origin}\r\n" - . "Sec-WebSocket-Location: ws://{$host}{$resource}\r\n" - . ($protocol ? "Sec-WebSocket-Protocol: {$protocol}\r\n" : "") - . "\r\n" - . $this->_createHandshakeThingy($key1, $key2, $code) - ; + $body = $this->sign($request->getHeader('Sec-WebSocket-Key1'), $request->getHeader('Sec-WebSocket-Key2'), $request->getBody()); + + $headers = array( + 'Upgrade' => 'WebSocket' + , 'Connection' => 'Upgrade' + , 'Sec-WebSocket-Origin' => $request->getHeader('Origin') + , 'Sec-WebSocket-Location' => 'ws://' . $request->getHeader('Host') . $request->getPath() + ); + if ($request->getHeader('Sec-WebSocket-Protocol')) { + $headers['Sec-WebSocket-Protocol'] = $request->getHeader('Sec-WebSocket-Protocol'); + } + + $response = new \Guzzle\Http\Message\Response(101, $headers, $body); + return $response; + + } public function newMessage() { @@ -59,17 +56,19 @@ class Hixie76 implements VersionInterface { return chr(0) . $message . chr(255); } - protected function _doStuffToObtainAnInt32($key) { - return preg_match_all('#[0-9]#', $key, $number) && preg_match_all('# #', $key, $space) ? - implode('', $number[0]) / count($space[0]) : - '' - ; + protected function generateKeyNumber($key) { + + $int = preg_replace('[\D]', '', $key) / substr_count($key, ' '); + return (is_int($int) && substr_count($key, ' ') > 0) ? $int : ''; + + } - protected function _createHandshakeThingy($key1, $key2, $code) { + protected function sign($key1, $key2, $code) { + return md5( - pack('N', $this->_doStuffToObtainAnInt32($key1)) - . pack('N', $this->_doStuffToObtainAnInt32($key2)) + pack('N', $this->generateKeyNumber($key1)) + . pack('N', $this->generateKeyNumber($key2)) . $code , true); } diff --git a/lib/Ratchet/Application/WebSocket/Version/RFC6455.php b/lib/Ratchet/Application/WebSocket/Version/RFC6455.php index bb579cb..577506e 100644 --- a/lib/Ratchet/Application/WebSocket/Version/RFC6455.php +++ b/lib/Ratchet/Application/WebSocket/Version/RFC6455.php @@ -2,6 +2,8 @@ namespace Ratchet\Application\WebSocket\Version; use Ratchet\Application\WebSocket\Version\RFC6455\HandshakeVerifier; use Guzzle\Http\Message\RequestInterface; +use Guzzle\Http\Message\Response; + /** * @link http://tools.ietf.org/html/rfc6455 @@ -36,13 +38,17 @@ class RFC6455 implements VersionInterface { throw new \InvalidArgumentException('Invalid HTTP header'); } - return array( - '' => 'HTTP/1.1 101 Switching Protocols' - , 'Upgrade' => 'websocket' + $headers = array( + 'Upgrade' => 'websocket' , 'Connection' => 'Upgrade' , 'Sec-WebSocket-Accept' => $this->sign($request->getHeader('Sec-WebSocket-Key')) -// , 'Sec-WebSocket-Protocol' => '' ); + + + $response = new \Guzzle\Http\Message\Response(101, $headers); + return $response; + + } /**