Не удается получить подключение 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" должен иметь значение как для сервера, так и для клиента. Это касается и меня.