Может ли websocket поддерживать сжатие gzip?

После успешного рукопожатия WebSocket мы могли бы использовать сжатие gzip?

Вот мои тесты:

  • Я использую autobahn lib для сборки сервера, а затем для клиента как:
    HTTP/1.1 101 Switching Protocols content-encoding: gzip Connection: Upgrade Server: AutobahnPython/?.?.? Upgrade: WebSocket Sec-WebSocket-Accept: RIR8KmljoV8Cv9mdiLY7GM2nYMc=
  • тогда мой сервер использует сжатие gzip
  • и хром-браузер получил результат, но он сказал мне, что "не может декодировать текстовый фрейм как UTF-8"

Ответ 1

Сжатие WebSocket включено в некоторых браузерах по умолчанию (на момент написания, например, в Chrome, но не в Firefox). Для этого клиент должен включить заголовок "Sec-WebSocket-Extensions: permessage-deflate". Если сервер отвечает с тем же расширением, связь WebSocket сжимается на основе кадра. Насколько я знаю, API-интерфейс браузера не включает/отключает расширения.

Хорошая статья по теме: https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/

Ответ 2

Существует расширение сжатия работал над рабочей группой IETF Websocket (HyBi). Я бы предложил следующие списки рассылки для получения актуальной информации. Я также рекомендую проверить этот вопрос.


Обновление 2017: расширение доступно в течение некоторого времени, см. здесь: https://tools.ietf.org/html/rfc7692

Ответ 3

Да, может. Chrome 19+ поддерживает его.

"https://github.com/crossbario/autobahn-python/blob/master/examples/twisted/websocket/echo_compressed/server_advanced.py"

from twisted.internet import reactor
from twisted.web.server import Site
from twisted.web.static import File

from autobahn.twisted.websocket import WebSocketServerFactory, \
    listenWS

from autobahn.websocket.compress import *

def accept(offers):
    for offer in offers:
        return PerMessageDeflateOfferAccept(offer)

debug = True
factory = WebSocketServerFactory(u"ws://127.0.0.1:9000", debug=debug, debugCodePaths=debug)
factory.setProtocolOptions(perMessageCompressionAccept=accept)

listenWS(factory)

webdir = File(".")
web = Site(webdir)
reactor.listenTCP(8080, web)

reactor.run()

Дополнительная информация: как PerMessageDeflateOffer используется в примерах Autobahn.