久しぶりにmod_perlプログラミング

  • 投稿日:
  • by
  • カテゴリ:

仕事で何とかしたい問題があって、Apacheのハンドラを書けば解決しそうだったので、久しぶりにmod_perlプログラミングをしてみました。
以前書いたのは4年前とかそんくらい。
その間にmod_perlも1.xから2.xに変わり、結構変更が加えられているとの噂です。
mod_perl2.xに慣れるのと肩慣らしの意味も含めて、HTTPリクエストヘッダをdumpするハンドラにチャレンジ。

httpd.confにこんな感じでmod_perl用の記述を追加。

PerlSwitches -I/usr/local/apache2/site_perl
PerlFixUpHandler Apache::DumpHeader

で、/usr/local/apache2/site_perl/Apache/DumpHeader.pm を以下のように。

package Apache::DumpHeader;

use strict;
use APR::Table ();
use Apache2::RequestRec ();
use Apache2::Const -compile => qw(OK DECLINED);
use Data::Dumper;

sub handler {
    my $r = shift;
    warn $r->method;
    warn Dumper $r->headers_in;
    return Apache2::Const::DECLINED;
}

1;

こんな感じでとりあえず動くようになりました。

とにかく探り探り。
最初

PerlSetEnv PERL5LIB /usr/local/apache2/site_perl

ってやってたけど
failed to resolve handler `Apache::DumpHeader': Can't locate Apache/DumpHeader.pm in @INC

って言われてApache/DumpHeader.pmを見つけてくれないし(※mod_perl2からはPerlSetEnv PERL5LIB じゃなくて PerlSwitches -Iに変わった)、
その次は
Can't locate object method "method" via package "Apache2::RequestRec"

って言われてしまうし(※use Apache2::RequestRec (); をしていなかった)、

return OK;
ってやっても
Bareword "OK" not allowed
って言われて何故だか全くわからなかったし(※mod_perl1.x時代は return OK; って書き方で行けた記憶が…)、

とにかくドキュメントを読みながらやったんだけど、ドキュメントの通りにやってもうまく行かなかったりして、久しぶりのmod_perlプログラミングはわからないことだらけで大変でした。
つーか、この書き方で正しいのかどうかもわからん。
naoyaさんのリファクタリング講座でとりあげてくんねーかな。

当初の予定では、HTTPリクエストヘッダの中のRefererを見て、特定のRefererだったら処理を変えるなんてのを作ろうと思っていたのですが、よく考えたらmod_rewriteだけでも出来そうな気がしてきた。これって無駄足だったって事か。
しょぼーん。