November 12, 2008

[自分メモ]Apache Moduleをつくる - モジュール宣言とフック関数

Apacheのモジュール開発とはフック関数を開発することである、といって良いと思います。

Apacheが起動した後、HTTPリクエストを受けてからレスポンスを返すまでにはいくつかの段階があります。

開発者は、その中の任意のポイントに独自のフック関数を登録することにより、リクエストの転送などの処理を行ったり、レスポンスを関数内で動的に生成する処理を行ったりすることができます。

それを踏まえた上で、前回の記事の続きです。
前回の記事で示したコマンドを実行すると、blog/mod_blog.cというファイルが生成されます。

これがモジュールのソースコードの雛形になります。

ソースコードの内、始めに注目するべきなのは末尾のモジュール宣言の部分です。
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA blog_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    NULL,                  /* table of config file commands       */
    blog_register_hooks  /* register hooks                      */
};
NULLがたくさん入っているのは、本来はコンフィグ関連の関数を登録する場所です。コンフィグを利用しない場合はNULLを設定することができます。

blog_register_hooksはフック関数を登録するための関数です。この中でフック関数の登録を行います。
blog_register_hooksの中身は以下のようになっています。
static void blog_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(blog_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
ap_hook_handlerによりフック関数の登録処理を行っています。

ap_hook_handlerはHTTPリクエストに対する応答内容を生成するためのフック関数を登録するために利用される関数です。

フック関数の登録用の関数としては他にも
ap_hook_quick_handler
リクエストの処理が始まる前に呼ばれるフック関数の登録
ap_hook_post_config
サーバの起動後、コンフィグ終了後に呼ばれるフック関数の登録
などが存在します。

参考:http://httpd.apache.org/docs/2.2/ja/developer/modules.html

mod_blog.cではap_hook_handlerでフック関数としてblog_handlerが登録されておりこの中でレスポンスの生成が行われます。
static int blog_handler(request_rec *r)
{
    if (strcmp(r->handler, "blog")) {
        return DECLINED;
    }
    r->content_type = "text/html";

    if (!r->header_only)
        ap_rputs("The sample page from mod_blog.c\n", r);
    return OK;
}
3〜5行目では、リクエストに含まれる"handler"という要素をチェックしています。これは、このリクエストが、このフック関数で処理すべきリクエストかどうかをチェックする処理です。この処理を行わないと、全てのリクエストに対してこの関数内の処理が実行されてしまいます。

6行目はレスポンスヘッダのcontent-typeを設定しています。8,9行目はレスポンス内容の書き込みを行っています。!r->header_onlyはリクエストがHEADだった場合は、レスポンスを行わないことを意味します。

matssaku at 01:14│Comments(0)TrackBack(0)clip!httpd | C

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔