Веб-сокет PHP не работает в сафари, модификация заголовков

Я выполнил веб-сокет с рисованием, используя приведенный ниже источник https://github.com/kallaspriit/PHP-HTML5-WebSocket-Server

Мне удалось запустить скрипт, который работает в браузерах FF и Chrome, но не работает в сафари. Насколько я знаю, это может быть связано с рукопожатием, которое используется в сафари (отличается от FF и Chrome).

В классе SocketServer.php я нашел следующее правило:

$headers = $this->parseRequestHeader($buffer);

if (isset($headers['Sec-WebSocket-Key'])) {
    $key = $headers['Sec-WebSocket-Key'];
} else {
    $key = $headers['Sec-WebSocket-Key1'];
}
$hash = base64_encode(
        sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)
);

/ в ff и chrome в заголовке есть Sec-WebSocket-Key, а в сафари есть Sec-WebSocket-Key1 и Sec-WebSocket-Key2/

if (isset($headers['Sec-WebSocket-Key'])) {
    $headers = array(
        'HTTP/1.1 101 Switching Protocols',
        'Upgrade: websocket',
        'Connection: Upgrade',
        'Sec-WebSocket-Accept: ' . $hash
    );
} else {
    $headers = array(
        "HTTP/1.1 101 Web Socket Protocol Handshake",
        "Upgrade: WebSocket",
        "Connection: Upgrade",
        "WebSocket-Origin: http://localhost",
        "WebSocket-Location: ws://localhost:9300",
    );
}

$headers = implode("\r\n", $headers) . "\r\n\r\n";
$left = strlen($headers);

do {
    $sent = @socket_send($this->socket, $headers, $left, 0);

    if ($sent === false) {
        $error = $this->server->getLastError();

        throw new Exception(
                'Sending handshake failed: : ' . $error->message .
                ' [' . $error->code . ']'
        );
    }

    $left -= $sent;

    if ($sent > 0) {
        $headers = substr($headers, $sent);
    }
} while ($left > 0);

$this->state = self::STATE_OPEN;

}

Я пытался изменить заголовки для сафари, но безрезультатно. Safari подключает меня и отключает одновременно - я думаю, что проблема вызвана этими заголовками, и я не знаю, как настроить их для правильной работы. Кто-нибудь знает, как изменить код для поддержки сафари, а также других браузеров?


person pablo    schedule 11.12.2012    source источник
comment
В какой версии вы можете увидеть обсуждение stackoverflow.com /questions/1253683/ здесь   -  person Anup Yadav    schedule 11.12.2012


Ответы (1)


Похоже, сервер WebSocket не обновлялся 9 месяцев. Итак, я бы порекомендовал вам взглянуть на альтернативное решение PHP WebSocket, такое как Ratchet, которое активно разрабатывается.

person leggetter    schedule 12.12.2012