private function sendHandshakeResponse() { // Last 8 bytes of the client's handshake are used for key calculation later $l8b = $this->request->getContent(); // Check for 2-key based handshake (Hixie protocol draft) $key1 = $this->getHandshakeRequest()->getHeader('Sec-Websocket-Key1')->getFieldValue(); $key2 = $this->getHandshakeRequest()->getHeader('Sec-Websocket-Key2')->getFieldValue(); // Origin checking (TODO) $originHeader = $this->getHandshakeRequest()->getHeader('Origin', null); $host = $this->getHandshakeRequest()->getHeader('Host')->getFieldValue(); $location = $this->getHandshakeRequest()->getUriString(); // Build response $response = new Response(); $response->setStatusCode(101); $response->setReasonPhrase("WebSocket Protocol Handshake"); $headers = new Headers(); $response->setHeaders($headers); $headers->addHeaderLine("Upgrade", "WebSocket"); $headers->addHeaderLine("Connection", "Upgrade"); if ($originHeader) { $headers->addHeaderLine("Sec-WebSocket-Origin", $originHeader->getFieldValue()); } $headers->addHeaderLine("Sec-WebSocket-Location", "ws://{$host}{$location}"); // Build HIXIE response $response->setContent(self::calcHixieResponse($key1, $key2, $l8b)); $this->setResponse($response); $handshakeRequest = new Handshake($this->getHandshakeRequest(), $this->getHandshakeResponse()); $this->emit("handshake", [$handshakeRequest]); if ($handshakeRequest->isAborted()) { $this->close(); } else { $this->socket->write($response->toString()); $this->logger->debug("Got an HYBI style request, sent HYBY handshake response"); $this->emit("connect"); } }
private function readHandshakeResponse($data) { $response = Response::fromString($data); $this->setResponse($response); $handshake = new Handshake($this->request, $response); $this->emit("handshake", array($handshake)); if ($handshake->isAborted()) { $this->close(); return ''; } $this->connected = true; $this->emit("connect"); return $response->getContent(); }