2012年4月1日日曜日

node-websocket-server と Firefox11 とで通信するとうまく動かない?

!!!注!!! この記事は書かれたのが2012年4月とかなり古いです。状況は大幅に変わっていると思いますので、参考程度でお願いします。

最近ちょっとnode.jsをローカルに入れて弄っています。
で、WebSocketとやらを実験的に触ってみようと、
よく紹介されている node-websocket-server というパッケージを npm で入れてみました。
しかし、なんだかローカルのnode.jsサーバー + node-websocket-server と
Firefox11 とを通信させようとしてもうまく動かなくて困ってしまいました。

調べてみると、node-websocket-server の本家はここみたいです。
https://github.com/miksago/node-websocket-server

ただ、作者が忙しいみたいで、最近は更新が止まっています。
代わりにそれをforkした以下だともう少し先に進んでいます。
https://github.com/VanCoding/node-websocket-server
node.js で 出来るだけ最新の node-websocket-server を使う。 の記事を参考にさせていただきました)
上記のは一応、websocket protocolの draft 16 まで対応してます、という体です。

wikipediaによれば、Firefox 11やChrome16以降では RFC6455  (draft17 の次、ほぼ最終版?) に従った実装がされているので、
後者のパッケージの方を使えば、比較新しいしちゃんと動くのかなあと期待したわけです。
で、改めてこれを入れてみて動かしてみたのですが・・・

うーん。やっぱりFirefox 11では動かない。
ふと思いついて、試しにChrome 16を使ってみると・・・なんとうまく動いてしまいました。
えっ? なんで? なんでなの!?
混乱しながらlogを仕込んで調べてみたら、さらに次のようなことがわかりました。

WebSocketのシェイクハンド時に用いるHTTPヘッダの Connection フィールドについて、
昔のdraftでは "Upgrade" というトークンのみが入っていることが期待されていたようです。
しかし、比較的新しい仕様 (draft13 以降) では、
"Upgrade" が含まれていれば他のトークンも含まれてよいことになっています。
Firefox11ではそれに従い、

Connection: Keep-alive, Upgrade

と入っているみたいです。
結果として(昔のdraftに従って書かれた) node-websocket-serverだと
シェイクハンド時のチェックで invalid 扱いになりはじかれてしまいます。
具体的には、node-websocket-server の lib/ws/server.js にある、次の行の部分です。



そのチェックコードを以下のように弄ったら、Firefoxでもうまく動きました。うわーい。
(修正は faye-websocket-node のコードを参考にしています)



パッケージとして公開するならもっとちゃんとメンテしてくれないと困る、というお話でした。

0 件のコメント:

コメントを投稿