仕事で何とかしたい問題があって、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だけでも出来そうな気がしてきた。これって無駄足だったって事か。
しょぼーん。
コメント