Реализация рукопожатия для Hybi-17 - PullRequest
0 голосов
/ 27 октября 2011

Я пытаюсь разработать рукопожатие для протокола веб-сокета 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));

Теперь, следуя примеру, начиная с клиентазапрос (просто выполняется с помощью вызова 'new MozWebSocket (host)'):

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=

Iследовал тому, что указано в проекте IETF hybi-17, но клиентский запрос все еще находится на рассмотрении , и между клиентом и сервером нет реальной связи.

Что не так? Что мне делать дальше?

Заранее спасибо.

1 Ответ

1 голос
/ 27 октября 2011

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...