HttpMessageHandler は、HTTP サーバー上で nineメッセージ通信を行うためのフレームワーククラスである。
class HttpMessageHandler: public HttpHandler
{
public:
bool initialize(const HttpMessageHandlerConfig* pCfg);
virtual void turn(); //!< HTTPセッションの時間切れ判定を行う
virtual bool handleMessage(Message* pMsg);
bool post(int sid, const Message*, const SendContext* = NULL);
bool queue(int sid, Message*, const SendContext* = NULL);
bool flow(int sid);
void closeLater(int sid);
virtual void onSessionOpen(int sid);
virtual void onSessionClose(int sid);
};
HttpMessageHandler は HttpHandler を継承している。利用するには、HttpHandler と同様に HttpServer の authorizeHttp() 関数の戻り値で渡せばよい。
HttpHandler は、onHttpRequest() などの生の HTTP を扱うためのハンドラ関数を実装する必要があった。HttpMessageHandler ではこれらのハンドラ関数の実装をしているので、アプリケーション側でさらにオーバーライドする必要はない。
HttpMessageHandler の動作は、HTTP 接続にセッションを持たせただけである。 このセッションは、仮想的な接続として振る舞う。
クライアントは HTTP リクエストの QueryString または Cookie にセッションIDを持たせる。 サーバー側はリクエストハンドラの中で既存のセッションと対応付ける。
セッションにはタイムアウトを設ける。セッションに所属する HTTPリクエストが一定時間来なかったら、セッションは切断されたものとみなす。
HttpMessageHandler は、仮想的な接続である HTTP セッションを導入している。HttpMessageHandler で、通信路を指定する場合は、ユニークなセッションIDを使う。
このセッションID は、実接続のコミュニケータID とは独立した識別子である。 異なる communicatorId が同一のセッションIDを示す場合もあるし、その逆もありうる。
HttpMessageHandler は initialzie 関数を実装している。オブジェクトの生成後にこの関数を呼んで、適切に設定を行う必要がある。
struct HttpMessageHandlerConfig
{
int nSessions; //!< セッションの数
int sessionTimeoutSec; //!< 次のHTTPリクエストが来るまでセッションを維持する時間[秒]
// sessionCookie か sessionQueryString のどちらかの指定は必須
std::string sessionCookie; //!< セッション情報を保持する cookie 名を指定。
std::string sessionCookiePath; //!< セッション用 cookie のパス
std::string sessionCookieDomain; //!< セッション用 cookie のドメイン
std::string sessionQueryString; //!< セッション情報を保持する querystring の key を指定。
std::string jsonp; //!< 応答を JSONP 形式で行う。JSONP関数名を保持する key を指定。
// enableQueryStringMarshal か enablePostMarshal のどちらかの指定は必須
bool enableQueryStringMarshal; //!< QueryString へのメッセージ直列化を処理する
bool enablePostMarshal; //!< POST Body へのメッセージ直列化を処理する
HttpHandler と違い、HttpMessageHandler では定期的に turn() を呼ぶ必要がある。
turn() では、HTTPセッションの時間切れ判定を行っている。
セッションの新規確立時には onSessionOpen() が、セッションの終了 OnSessionClose() が呼ばれる。
セッションはタイムアウトで切断されるが、明示的に閉じたい場合には closeLater() を呼ぶ。
handleMessage(), post(), queue(), flow() といった一連のメッセージ関数を定義している。
これらの使い方は基本的に MessageServer と同じであるが、前に述べたように HTTP の性質に起因する制約がある。
handleMessage() で受け取ったメッセージオブジェクトの Message::getCommunicatorId() を呼び出して得られる値は、コミュニケータIDではなくセッションIDになっている。