2012-07-25 24 views
19

WebSocketの成功したハンドシェイクの後、gzip圧縮を使用できますか?ここでwebsocketはgzip圧縮をサポートできますか?

は私のテストです:

  1. 私はその後、としてクライアントにrespon、サーバーを構築するためにアウトバーンのLIBを使用します。
    HTTP/1.1 101 Switching Protocols content-encoding: gzip Connection: Upgrade Server: AutobahnPython/?.?.? Upgrade: WebSocket Sec-WebSocket-Accept: RIR8KmljoV8Cv9mdiLY7GM2nYMc=
  2. その後、私のサーバーは
  3. のgzip圧縮を使用し、Chromeブラウザが得ましたその結果、「テキストフレームをUTF-8としてデコードできなかった」と言われました。
+0

(現在)AutobahnPythonはフレームごとの圧縮拡張をサポートしていません。いずれの場合でも、サポートのシグナリングは、WebSocket固有のHTTPヘッダーを介して行われ、「コンテンツエンコーディング」は行われません。 – oberstet

+0

思い出してくれてありがとう。いずれにしても、WebSocketを使用してhttpメソッドとしてgzip圧縮をサポートする簡単な方法がありますか? – littlesun

+0

いいえWebSocketで圧縮を使用するには、拡張機能を実装する必要があります。これには重要なコードが必要です。 – oberstet

答えて

4

compression extensionがありますworked onをIETF Websocket(HyBi)ワーキンググループによって作成します。メーリングリストに従って最新の情報を入手することをお勧めします。また、this questionをチェックアウトすることをお勧めします。


アップデート2017:拡張子は今ここを参照してください、いくつかの時間のために利用されている:https://tools.ietf.org/html/rfc7692

+0

使い方を教えていただけますか?私はRFC 6455を調べましたが、使用方法はわかりません。 – littlesun

+0

Dreenに感謝します。素晴らしいです。私は圧縮拡張を研究します。それについて他の友人が勉強していますか? – littlesun

+0

@littlesun:私が知っている限り、この拡張モジュールはまだ作業中ですので、まだ利用できません(これは、フレームごとの「メッセージごとの」アプライアンスに変更されたという主な証拠です) 。 Javascript自体は実際には圧縮/圧縮解除をサポートしていません。私は、今のところ唯一の解決策は、IETFの人々が仕様を完成させるのを待つことと、ブラウザベンダーが実装することを待つことだと思っています...長くはならないでしょう、IMHOおそらく数ヶ月で起こります。 – Dreen

6

のWebSocketの圧縮は、Chromeで例えば書き込み時(デフォルトでは一部のブラウザで有効になっていないが、 Firefoxで)。クライアントは、このために「Sec-WebSocket-Extensions:permessage-deflate」ヘッダーを含める必要があります。サーバが同じ拡張子で応答する場合、WebSocket通信はフレーム単位で圧縮されます。私が知る限り、拡張機能を有効/無効にするブラウザAPIはありません。

トピックについての良い記事は以下のとおりです。https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/

0

はい、それはできます。 Chrome 19+ supports it.

"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() 

さらに詳しい情報:how PerMessageDeflateOffer is used in Autobahn examples