Я пытаюсь построить сервер веб-сокетов на Delphi6, используя черновой вариант hixie-76, и у меня проблема с рукопожатием.
Отпечаток md5, который я получаю с тремя частями, кажется неправильным, когда я его пробую, но когда я использую тот же алгоритм с примером, приведенным в спецификации протокола, я получаю хороший ответ md5 ...
Я обрабатываю вот так, преобразую число, найденное в key1, деленное на количество пробелов в 32-битном слове, то же самое с key2 и, наконец, добавляю последние 8 байтов (key3), чтобы получить 128-битную строку, которую я использую как запись md5.
используя 155712099, 173347027 для key1 и key2 и 'Tm [K T2u' для key3, я получаю правильный отпечаток md5, и поэтому я не понимаю, почему этот алгоритм не даст правильный отпечаток пальца клиенту
вот пример того, что я получаю:
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8018
Origin: null
Sec-WebSocket-Key1: 4 102(2 6U 2 3 18
Sec-WebSocket-Key2: 69V86`6t)e 0 2 42
M]Rzÿõ&
и рукопожатие, которое я даю в ответ
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://localhost:8018/
µ&Mq˜8èõÙZÙ,hœi
Может быть, есть еще одна проблема с моим ответом, но кажется, что у меня проблема с моим отпечатком md5.
Кто-нибудь видит, где моя ошибка ??
Заранее спасибо за помощь
Обновление
Я видел этот блок, но если я не очень плохо читаю, часть рукопожатия этого класса не вычисляет сумму md5, я думаю, что она использует более старую версию протокола, а не текущую (76)
Когда я смотрю на следующий код, я вижу, что ответ написан без ответа md5.
`попробуй
// Прочитать заголовки запроса
HandshakeRequest: = TWebSocketRequest.Create (ServerConnection);
// Send response headers
ServerConnection.WriteLn('HTTP/1.1 101 Web Socket Protocol Handshake');
ServerConnection.WriteLn('Upgrade: WebSocket');
ServerConnection.WriteLn('Connection: Upgrade');
ServerConnection.WriteLn('WebSocket-Origin: ' + HandshakeRequest.Origin);
ServerConnection.WriteLn('WebSocket-Location: ws://' + HandshakeRequest.Host + '/');
// End handshake
ServerConnection.WriteLn;
ServerConnection.WriteLn;
HandshakeResponseSent := True;
за исключением
на E: TWebSocketHandshakeException do
начать
// Закрываем соединение, если рукопожатие не удалось
ServerConnection.Disconnect;
конец; `
Еще раз спасибо
Обновление 2011 04 14
Я наконец-то нашел, где была проблема ...
Я строил свой ответ так:
resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +<br>
#13#10#13#10 +<br>
md5response;
таким образом, было 3 0x0D 0x0A вместо 2 до отпечатка пальца md5 ...
Поскольку я не могу ответить на свой вопрос, я не смогу его пометить, но он есть! :)