ochalog

RubyとMediaWikiとIRCが好き。

どどんとふの CGI 処理(構成・インターフェース)

最近は TRPG のオンラインセッション環境どどんとふのソースを読んだり変えたりしていることが多い。TRPG.NET ではオンラインセッションが多く行われる夜間に結構重くなるので、負荷を下げることを目標としている。ソースコードの規模が大きいので、テストコードを追加しながら機能単位での分割などを行い、改善点を見つけやすくしたり部品の再利用を行いやすくしたりしている。

今回から、備忘録を兼ねて、これまで調べたどどんとふの CGI 処理について数回書く。コードへのリンクは ver. 1.47.24 リリース時のコミット 94c3c04 を使うことにする。

どどんとふのプログラムの構成

どどんとふは主に Flash で作られたクライアントプログラム(DodontoF.swf、以下 SWF)と、Ruby で書かれたサーバープログラム(DodontoFServer.rb、以下サーバー)からなる。サーバーは CGI プログラムとして動作する。この他にスマートフォン等向けの Web アプリ(chat.html)もあるが、ここでは割愛する。

サーバーとの通信

SWF とサーバーとの通信

SWF はサーバーへ HTTP の POST メソッドでメッセージデータを送信する。SWF から送信されるメッセージデータは、ActionScriptJavaScript)のオブジェクトを MessagePack*1 に変換したものである。これを受け取ったサーバーは SWF へ JSON 形式で(JSON の)オブジェクトを返す。

コマンドの一覧は DodontoFServer.rb の 749〜829 行にある。これは DodontoFServer#analyzeCommand メソッドの一部である。

Web インターフェース(WEB IF)

サーバーは Web API(これをどどんとふでは「WEB IF」と表現している)を提供している。利用者はサーバーを HTTP の GET または POST メソッドで呼び出すことにより WEB IF を利用することができる。

GET の場合は必要な情報をクエリパラメータで指定する。どのコマンドでも共通なパラメータを以下に示す。

パラメータ 説明
webif 呼び出す WEB IF コマンドを指定する。
callback JSONP の関数を指定する。省略可。

POST の場合はボディ部に同様のクエリ文字列を入れて呼び出す。

どちらの場合も結果として JSON 形式で(JSONの)オブジェクトが返る。

WEB IFのコマンドの詳細はマニュアルの「WEB IF について」にある。

例:WEB IF の getBusyInfo コマンドを GET メソッドで呼び出す場合

http://example.net/DodontoF/DodontoFServer.rb?webif=getBusyInfo を呼び出すと、以下のような結果が返る。

{"loginCount":0,"maxLoginCount":30,"version":"Ver.1.47.24(2016/04/07)","result":"OK"}

JSONP の関数を指定する場合は、例えば http://example.net/DodontoF/DodontoFServer.rb?webif=getBusyInfo&callback=print を呼び出すと以下のような結果が返る。

print({"loginCount":0,"maxLoginCount":30,"version":"Ver.1.47.24(2016/04/07)","result":"OK"});

応答の Content-Type ヘッダ

SWF との通信でも WEB IF でも応答は JSON 形式であるが、Content-Type ヘッダの値は Content-Type: text/plain; charset=utf-8 となる。RFC 4627JSONMIME タイプは application/json と指定されているので、Content-Type: application/json; charset=utf-8 とするのが正しい。

次回

ochaochaocha3.hateblo.jp

*1:空間効率の良いシリアライズ形式。http://msgpack.org/