Рукопожатие не работает на Safari, но работает на Chrome - PullRequest
1 голос
/ 12 марта 2012

Я обнаружил проблему при попытке протестировать приложение веб-сокета. Мой сервер написан на Delphi 7, и я пытаюсь подключить к нему браузер клиента.

Я знаю, что Chrome использует протокол "draft-ietf-hybi-thewebsocketprotocol-06", а Safari использует протокол "draft-ietf-hybi-thewebsocketprotocol-00". Итак, я сделал специфику для обоих.

Итак, когда я запускаю код клиента в Chrome, он работает нормально, e я получил подтверждение, которое принимается браузером. После этого я могу отправлять и получать сообщения с обеих сторон.

Но когда я запускаю тот же код клиента в браузере Safari, он вообще не работает. Я получил рукопожатие из браузера на моем сервере, например:

GET / HTTP/1.1
#$D#$A
Upgrade: WebSocket
#$D#$A
Connection: Upgrade
#$D#$A
Host: 192.168.0.1:5050
#$D#$A
Origin: http://192.168.0.1
#$D#$A
Cookie: PHPSESSID=87i5k8n2f2i6e05sesmgvv9q82
#$D#$A
Sec-WebSocket-Key1: 133r  170600  u j5
#$D#$A
Sec-WebSocket-Key2: 6"3 7#  "' 9 Z0v7Vo 011 :
#$D#$A
#$D#$A
q¯×/­“#$11ï

Итак, мой сервер отвечает:

HTTP/1.1 101 WebSocket Protocol Handshake
#$D#$A
Upgrade: WebSocket
#$D#$A
Connection: Upgrade
#$D#$A
Sec-WebSocket-Origin: http://192.168.0.1
#$D#$A
Sec-WebSocket-Location: ws://192.168.0.1:5050/
#$D#$A
Sec-WebSocket-Protocol: chat
#$D#$A
#$D#$A
ñˆñ ÷æD‡Tí#0d+ãó-

Кажется, все в порядке! Но клиент не принимает ответ и немедленно закрывает соединение.

Первое, что мне пришло в голову, было что-то не так с моим ответом на рукопожатие Safari (draft-ietf-hybi-thewebsocketprotocol-00). Но, выполняя поиск в Интернете, я нашел веб-сайт WebSocket.org, где у них есть «Эхо-тест» (http://www.websocket.org/echo.html). Самое любопытное, что я обнаружил, выполняя обычный тест, Chrome и Safari работали нормально. Но, сохраняя пример кода, который есть на странице, и выполняя его локально, даже подключаясь к серверу WebSocket, Safari тоже не работает. Итак, я думаю, что с Safari что-то другое. Кто-нибудь может, пожалуйста, сохранить приведенный ниже код и запустить его в обоих браузерах (Safari и Chrome) и проверить, работает ли он на обоих? И кто-нибудь знает, что происходит?

<!DOCTYPE html>

<meta charset="utf-8" />
<title>WebSocket Test</title>

<script language="javascript" type="text/javascript">

var wsUri = "ws://echo.websocket.org/";
var output;

function init()
{
output = document.getElementById("output");
testWebSocket();
}

function testWebSocket() 
{
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}

function onOpen(evt) 
{
writeToScreen("CONNECTED");
doSend("WebSocket rocks");
}

function onClose(evt) 
{
writeToScreen("DISCONNECTED");
}

function onMessage(evt) 
{
writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
websocket.close();
}

function onError(evt) {
writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
}

function doSend(message) 
{
writeToScreen("SENT: " + message);
websocket.send(message);
}

function writeToScreen(message) 
{
var pre = document.createElement("p");
pre.style.wordWrap = "break-word";
pre.innerHTML = message;
output.appendChild(pre);
}

window.addEventListener("load", init, false);

</script>

<h2>WebSocket Test</h2>

<div id="output"></div>

</html>

Спасибо!

...