Не удается получить подключение websocket для работы в Chrome 19
У меня есть клиент/сервер websocket, который отлично работает с Firefox и Chrome 18. Он не работает с Chrome 19 beta. Я подозреваю, что это связано с тем, что этот браузер теперь использует расширение deflate-frame, которое мой сервер не поддерживает.
Chrome 19 beta отправляет это в своем рукопожатии: "Sec-WebSocket-Extensions: x-webkit-deflate-frame"
У меня есть сервер отправляет обратно: "Sec-WebSocket-Extensions:"
но либо это не правильный способ отклонить расширение или что-то еще не так, что я не улавливаю. Это единственное, что в рукопожатии отличается от того, что я вижу в рабочих браузерах.
Edit: вот дополнительная информация. Это рукопожатия, захваченные Wireshark.
рукопожатие с помощью Firefox 12:
GET / chatserver HTTP / 1.1
Ведущий: (опущено для этого поста)
User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 12.0) Gecko / 20100101 Firefox / 12.0
Принимаем: текст/HTML,приложение/с xhtml+xml,в приложение/XML;Q в=0.9,/; q=0,8
Accept-язык: en-us, en; q=0.5
Принять-кодировки: gzip-сжатия, выкачать
DNT: 1
Соединение: keep-alive, Upgrade
Sec-WebSocket-Версия: 13
Происхождение: (опущено для этого поста)
Sec-WebSocket-ключ: 2TKm4ozUQdNP17Lobt7IBg==
Pragma: no-cache
Cache-Control: нет-кэш
Обновление: websocket
протоколы переключения HTTP/1.1 101
Обновление: websocket
Подключение: Обновление
Sec-WebSocket-принять: pSUB3BT9YUUd9n3mOeWY / 1uVqJE=
рукопожатие с использованием Chrome 18:
GET / chatserver HTTP / 1.1
Обновление: websocket
Подключение: Обновление
Ведущий: (опущено для этого поста)
Происхождение: (опущено для этого поста)
Sec-WebSocket-ключ: zuHLEC8pGvAMadarhCLXFA==
Sec-WebSocket-Версия: 13
протоколы переключения HTTP/1.1 101
Обновление: websocket
Подключение: Обновление
Sec-WebSocket-принять: LMBSq6Bk9Kiv+zAbQlAL899pfzc=
рукопожатие с использованием Chrome 19:
GET / chatserver HTTP / 1.1
Обновление: websocket
Подключение: Обновление
Ведущий: (опущено для этого поста)
Происхождение: (опущено для этого поста)
Sec-WebSocket-Ключ: TbwnVcuUiqGgZn7hxvxzvQ==
Сек-С WebSocket-Версия: 13
Модели: SEC-WebSocket из-расширений: х-в WebKit-сдуваться-рамка
протоколы переключения HTTP/1.1 101
Обновление: websocket
Подключение: Обновление
Sec-WebSocket-принять: D45BJ+Vfydy1Upcs3Hze / nuiaS8=
Sec-WebSocket-Расширения:
все ответы сервера имеютR n окончания строк и включают дополнительный rn в конце сообщения.
работа FF12 и Chrome18 -- Chrome19 не работает. В Chrome19, очень следующий пакет после ответа на рукопожатие сервера-FIN / ACK. Соединение закрыто.
nb. Я также попытался использовать дефис в качестве значения Sec-WebSocket-Extensions, но это тоже не сработало.
2 ответов
нашел проблему.
во-первых, пустая запись Sec-WebSocket-Extensions в ответе сервера производила "Invalid UTF-8 sequence in header value
" ошибка. После удаления этой записи оставшаяся ошибка была "A server must not mask any frames that it sends to the client.
"
действительно, моя реализация сервера (сильно измененная версия PHPWebSocket) по умолчанию маскирует кадры, которые он отправляет. Изменение этого поведения по умолчанию исправило проблему, и соединение websocket теперь работает в Chrome 19.
добавление тега PHPWebSocket на этот вопрос, поскольку это проблема с этим проектом.
для Chrome заголовок "Sec-WebSocket-Protocol" должен иметь значение как для сервера, так и для клиента. Это касается и меня.