パスワードを忘れた? アカウント作成
322612 journal

pascalの日記: IRC over WebSocket (2)

日記 by pascal

せっかく死ぬほどハマったので、注意すべき点をメモしておく。Viva bad knowhow!

(1) 仕様が固まってない
現時点で最新の仕様は draft-ietf-hybi-thewebsocketprotocol-07 。どんどんアップデートされているので、ぐぐって出てくる情報は古くて使えないのが結構多い。関数名変わってたりするし。

(2) (ちょっと)古いライブラリが転がってる
サーバを書くために Perl の Mojolicious::Lite ってのを最初使ったんだけど、うまくいかなくて原因不明だった。
今ならわかるよ、ライブラリとブラウザのバージョンの違いっぽい。このライブラリは僕が試した時点では draft-hixie-thewebsocketprotocol-75 以前のバージョンっぽくて、WebSocket Protocolのhandshakingのときに 'Sec-Websocket-Origin' フィールドを送ってくれない。試したのは 2011年5月頭なので、きっと直ると思うけども。

(3) (1)と(2)の理由から WebSocket Protocol 開発者がお勧めしてくれたのが pywebsocket。名前のとおり Python のライブラリ。echo サーバ / echo クライアントの見本が付いてるので、自分が作ったサーバ / クライアントがちゃんと動いているかの確認ができる。handshaking に問題があるときはどのヘッダがおかしいかもちゃんと教えてくれて便利。ちゃんとメンテナンスもされてるっぽい。

(4) mod_python / mod_pywebsocket で設定を書くファイルを間違えてちらっとハマったのでメモ。
mod_pywebsocket は pywebsocket についてくる。
今回いじったファイルは /etc/apache2/sites-available/default
追加した内容は以下のとおり。

<IfModule python_module>
  AddHandler mod_python .py
  PythonHandler mod_python.publisher
  PythonDebug On
 
  PythonOption mod_pywebsocket.handler_root /path/to/my/websocket/app/directory
  PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
  PythonOption mod_pywebsocket.allow_draft75 Off
 
  PythonPath "[ '/path/to/my/python/libraries' ] + sys.path"
</IfModule>

(5) mod_pywebsocketが動かないって思ってちょっと焦ったのでこれも一応。
(4) で設定したディレクトリ (/path/to/my/websocket/app/directory) の下にpython のコードを置く。ファイル名は "_wsh.py" で終わること。普通の python ではなく、以下の2つの関数が必要に応じてcallbackされるっぽい。

def web_socket_do_extra_handshake(request)
def web_socket_transfer_data(request)

(6) mod_python を使うときに import される自分のライブラリはどこに置けばいいの。
(4) に書いたけど、PythonPath を Apache2 の設定ファイルに書く必要がある。

(7) WebSocket から届いたデータを polling したいんだけど。
mod_pywebsocket に付いてくるファイル (msgutil.py) がその機能を実現してたので、それを使えばよいです。

mod_python + mod_pywebsocket がApache2 の上で動くことが確認できれば、そこまでハマることはないかなー。mod_python を走らせてる途中でプログラムが落ちるときは /var/log/apache2/error.log にエラーメッセージが入っててくれたし。

//

Ubuntu 9.04 を使ってるので、以下のコマンドを走らせれば必要なものは手に入りました。

sudo apt-get install libapache2-mod-python
svn checkout http://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...