Я пытаюсь разработать рукопожатие для протокола websocket hybi-17 ( http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 ). В соответствии с этим проектом я сделал для клиента (user-agent) следующий код:
var host = 'ws://localhost/server.php'; if ('MozWebSocket' in window) ws = new MozWebSocket (host); else ws = new WebSocket (host);
и этот код для сервера (я пропустил часть инициализации / управления сокета):
$key = $value = null; preg_match ("#Sec-WebSocket-Key: (.*?)\r\n#", $buffer, $match) && $key = $match[1]; $key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; $key = sha1 ($key); $key = pack ('H*', $key); $key = base64_encode ($key); $value = "HTTP/1.1 101 Switching Protocols\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "Sec-WebSocket-Accept: {$key}"; socket_write ($socket, $value, strlen ($value));
Теперь, следуя примеру, начиная с запроса клиента (просто делается с вызовом «новый MozWebSocket (хост)»):
GET /server.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive, Upgrade Sec-WebSocket-Version: 8 Sec-WebSocket-Origin: http://localhost Sec-WebSocket-Extensions: deflate-stream Sec-WebSocket-Key: oqFCBULD7k+BM41Bc3VEeA== Pragma: no-cache Cache-Control: no-cache Upgrade: websocket
Ответ сервера (эхом в локальной оболочке, как строка отладки):
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: TlKc0Ck7WpqsLhMm/QXABMQWARk=
Я следил за тем, что указано в проекте IETF hybi-17, но клиентский запрос все еще находится на рассмотрении, и между клиентом и сервером нет реального соединения.
Что не так? Что мне нужно делать больше?
Заранее спасибо.
Ответ HTTP определяется как:
Response = Status-Line ; Section 6.1 *(( general-header ; Section 4.5 | response-header ; Section 6.2 | entity-header ) CRLF) ; Section 7.1 CRLF [ message-body ] ; Section 7.2
Тело сообщения пуст, но после всех заголовков должно быть два CRLF (один CRLF после каждого заголовка и один последний дополнительный).
Таким образом, ваш код должен выглядеть так:
$value = "HTTP/1.1 101 Switching Protocols\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "Sec-WebSocket-Accept: {$key}\r\n\r\n";