Я хотел бы сделать рукопожатие с помощью delphi6 - PullRequest
1 голос
/ 07 апреля 2011

Я пытаюсь построить сервер веб-сокетов на 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 ...

Поскольку я не могу ответить на свой вопрос, я не смогу его пометить, но он есть! :)

1 Ответ

1 голос
/ 08 апреля 2011

В коде google для Delphi существует класс веб-сокетов, который может дать вам ответ:

http://code.google.com/p/delphiws/source/browse/trunk/source/uWebSocket.pas?r=4

...