Я пытаюсь создать сервер веб-сокетов на Delphi6, используя черновик hixie-76, и у меня проблема с рукопожатием.
Отпечаток пальца md5, который я получаю с тремя частями, кажется неправильным, когда я пробую его, но когда я использую тот же алгоритм с примером, приведенным в спецификации протокола, я получаю хороший ответ md5...
Я обрабатываю так, преобразую число, найденное в ключе 1, деленное на количество пробелов в 32-битном слове, то же самое с ключом 2 и, наконец, добавляю последние 8 байтов (ключ 3), чтобы получить 128-битную строку, которую я использую как запись md5 .
используя 155712099, 173347027 для ключа1 и ключа2 и «Tm[K T2u» для ключа3, я получаю правильный отпечаток 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.
` try // Чтение заголовков запроса 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 begin // Закрыть соединение, если рукопожатие не удалось ServerConnection.Disconnect; конец;`
Еще раз спасибо
Обновление 2011 04 14
Наконец-то я нашел, в чем была проблема...
я строил свой ответ так:
resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +
так что перед отпечатком md5 было 3 0x0D 0x0A вместо 2...
#13#10#13#10 +
md5response;
Поскольку я не могу ответить на свой вопрос, я не смогу отметить его как решенный, но это так! :)