Playframework 1.2.4にパッチを当ててChrome 16でWebSocketを動かす
Playframework 1.2.4では、Chrome 16のWebSocketが動かない
Chromeのstable版であるChrome 16はWebSocketのプロトコルが最新のRFC 6455となっていて、Playframework 1.2.4では動きません(参考URL)。
しかし、今作っているChrome拡張でWebSocketを使いたい為なんとかならんかなと、Playframeworkで使用しているJboss nettyのソースを見てみました。すると1.2.4で対応しているHybi10とRFC 6455はかなり近い事が分かりました(あくまでnettyのソースを見た範囲での話ですが…)。
なので、今回WebSocketで使いたいのはテキストのやり取りだけだし、プロトコルのバージョンを無視すれば(Hybi10と同じ扱いにすれば)もしかして動くのではないか…?
パッチ当ててみた
https://github.com/playframework/play/blob/master/framework/src/play/server/PlayHandler.java#L1100
を変えました。
diff --git a/framework/src/play/server/PlayHandler.java b/framework/src/play/server/PlayHandler.java index e30d097..365605a 100644 --- a/framework/src/play/server/PlayHandler.java +++ b/framework/src/play/server/PlayHandler.java @@ -1097,7 +1097,7 @@ public class PlayHandler extends SimpleChannelUpstreamHandler { private void upgradeResponseHybi10(HttpRequest req, HttpResponse res) { String version = req.getHeader("Sec-WebSocket-Version"); - if(!"8".equals(version)) { + if(!"8".equals(version) && !"13".equals(version)) { res.setStatus(HttpResponseStatus.UPGRADE_REQUIRED); res.setHeader("Sec-WebSocket-Version", "8");
見ての通り、やっているのは「Sec-WebSocket-Versionが8だけでなく13の場合も処理を継続する」だけです。
サンプルが動いた!
Playframeworkのsampleにあるchatで、websocketモードにしてみたところ、これまでChrome16で動いていなかったのが、無事動作しました!
まあ他はまだ試していないのですが、取り敢えずテキストはやり取り出来そうだという事でいったんこれで使ってみようと思います。