M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

MojoliciousのWebSocketをRFC 6455に未対応のSafariに対応させる

久しぶりにWebSocketの世界に戻ってきたら、だいたいのブラウザ(IEは10かららしいがまだ試していないや……)はWebSocketに対応していていい時代になったなーと思っていたのですけれども、iOSSafariは未だにRFC 6455よりも古い規格(hybi-00、またの名をhixie-76)にしか対応していないので、イマドキのMojolicious(Ver.3ぐらい)のWebSocketは使えないという状況でありました……

でも、ネットの海をダイブしていたら、MojoliciousのプラグインSafariが持つWebSocketのバージョンに対応出来ることがわかりました。

MojoX::Transaction::WebSocket76 - search.cpan.org

Mojolicious::Liteで使いたい場合は、
mojox-transaction-websocket76/websocket.pl at master · SetupRu/mojox-transaction-websocket76 · GitHub

のBEGIN節で書かれているhook書き換え(乗っ取り)ルーチンをコピペりましょう。

iOSSafariでアクセスした時は下記の通りのデバッグログが出ます。

[Mon Mar  4 09:44:06 2013] [debug] GET / (Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3).
[Mon Mar  4 09:44:06 2013] [debug] Rendering template "index.html.ep" from DATA section.
[Mon Mar  4 09:44:06 2013] [debug] 200 OK (0.044728s, 22.357/s).
[Mon Mar  4 09:44:07 2013] [debug] GET /stream (Anonymojo).
[Mon Mar  4 09:44:07 2013] [debug] Routing to a callback.
[Mon Mar  4 09:44:07 2013] [debug] Client connected: MojoX::Transaction::WebSocket76=HASH(0x2da0d40)
[Mon Mar  4 09:44:07 2013] [debug] 101 WebSocket Protocol Handshake (0.001161s, 861.326/s).

こっちは、MacSafariです。

[Mon Mar  4 09:44:13 2013] [debug] GET / (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2).
[Mon Mar  4 09:44:13 2013] [debug] Rendering cached template "index.html.ep" from DATA section.
[Mon Mar  4 09:44:13 2013] [debug] 200 OK (0.005317s, 188.076/s).
[Mon Mar  4 09:44:13 2013] [debug] GET /stream (Anonymojo).
[Mon Mar  4 09:44:13 2013] [debug] Routing to a callback.
[Mon Mar  4 09:44:13 2013] [debug] Client connected: MojoX::Transaction::WebSocket76=HASH(0x2ded4c0)
[Mon Mar  4 09:44:13 2013] [debug] 101 WebSocket Protocol Handshake (0.000536s, 1865.672/s).

デバッグログにMojoX::Transaction::WebSocket76=〜とか表示されているので、このプラグインでWebSocket通信開始のハンドシェイクが行われていることがわかります。

参考までに、Google Chromeの場合のデバッグログ。

[Tue Mar  5 02:21:36 2013] [debug] GET / (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22).
[Tue Mar  5 02:21:36 2013] [debug] Rendering template "index.html.ep" from DATA section.
[Tue Mar  5 02:21:37 2013] [debug] 200 OK (0.040269s, 24.833/s).
[Tue Mar  5 02:21:38 2013] [debug] GET /stream (Anonymojo).
[Tue Mar  5 02:21:38 2013] [debug] Routing to a callback.
[Tue Mar  5 02:21:38 2013] [debug] Client connected: Mojo::Transaction::WebSocket=HASH(0x2865940)
[Tue Mar  5 02:21:38 2013] [debug] 101 Switching Protocols (0.001302s, 768.049/s).

Mojoliciousの本体はどんどん先に行ってしまい古い規格への対応が切り捨てられがちな印象があるので、このようなプラグインがあるととても助かりますね!