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();
 }