遅まきながらmod_perl

先日のYAPC::ASIA Tokyo 2012で、「モダンmod_perl入門」というセッションを受講しました。
それに触発されて、ローカル環境のApache 2.2にmod_perlを入れてみました。

mod_perlは、「ApacheにPerlを組み込んで、CGIを高速化する仕組み」ととらえている方が多いと思います。
ただ、CGIの高速化は、mod_perlの一機能に過ぎません。
それよりも、「ApacheのモジュールをPerlで作ることができる」という点の方がはるかに大きいです。
Apacheの処理フェーズの各所に、Perlでの処理を挟むことができます。

セッションの中で、モジュールの一例として、HTMLをクライアントに出力する前に、HTML内の改行を除去する話が紹介されていました。
私も実際に試してみました。

まず、以下のようなPerlのモジュールを作り、@INCのパスのどこかに配置します。

package MyApache2::RemoveCR;

use APR::Table ();
use Apache2::Filter ();
use Apache2::RequestRec ();
use Apache2::Const -compile => qw(OK);

my $READ_CHUNK_LENGTH = 2048;

sub handler {
    my $f = shift;

    unless ($f->ctx) {
        $f->r->headers_out->unset('Content-Length');
        $f->ctx(1);
    }
    while ($f->read(my $buffer, $READ_CHUNK_LENGTH)) {
        $buffer =~ s/[\r\n]//g;
        $f->print($buffer);
    }
    return Apache2::Const::OK;
}
1;

そして、Apacheのhttpd.confファイルに、以下の記述を追加します。

<FilesMatch ".*html$">
  PerlOutputFilterHandler MyApache2::RemoveCR
</FilesMatch>

最後に、Apacheを再起動して、WebブラウザでHTMLにアクセスします。
HTMLのソースを見てみると、無事に改行がすべて削除されました。

Movable TypeのDynamicMTMLのような仕組みを、mod_perlで書くと面白いのではないかと思います。
時間を作って試してみたいです。