[Apache] Apacheモジュールで既存のモジュールの処理をたまに横取りをしたい2

id:higepon:20050727:1122450362で、Apacheモジュールについて質問させていただきました。
結構悩んでいたのですが、なんとApacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)の筆者の小山さんから長文のアドバイスをいただきました。
小山さんありがとうございます。(´▽`)


私がはまっていたポイントは

  SetHandler mod_test

httpd.confで設定していた部分です。


小山さんからのアドバイスにある通り

キモになるのは「SetHandlerは強制的にコンテンツハンドラを上書きする」という点かと思います。

SetHandlerをやるとコンテンツハンドラが上書きされてよろしくありません。
既存の設定を生かしつつ、ap_run_fixups()フェーズでハンドラを動的に変更することで、mod_rewriteなどの既存のモジュールに手を入れず、処理を横取りできるようになりました。


擬似コードは以下の通りです。

static int test_find_types(request_rec* r)
{
    if (ある条件が成立したら)
    {
        /* mod_testのコンテンツハンドラを使う */
        r->handler = ap_pstrdup(r->pool, "mod_test");
        return DECLINED;
    }
    else
    {
        /* 条件が成立していないので mod_rewriteのコンテンツハンドラに任せる */
        return DECLINED;
    }
}