Catalyst::Plugin::Static::Simpleで静的にサーブしているpdfとかの文書ファイルに(ベーシックとか)なんか適当な認証をかけたくて悩んでた。
そういうファイルはApacheとかに任せれば解決するんだろうけど、残念ながらApache動かせないというシチュエーション。
散々悩んだあげく別にStatic::Simple使わなくていいじゃんということに気づいてしまい、おもむろにStatic::Simpleのソースを読み始めた。
どうせFile::Slurpでもしてbodyに出力してるんだろうなぁと思ってたんだけど違った。
if ( Catalyst->VERSION le '5.33' ) {
# old File::Slurp method
my $content = File::Slurp::read_file( $full_path );
$c->res->body( $content );
}
else {
# new method, pass an IO::File object to body
my $fh = IO::File->new( $full_path, 'r' );
if ( defined $fh ) {
binmode $fh;
$c->res->body( $fh );
}
else {
Catalyst::Exception->throw(
message => "Unable to open $full_path for reading" );
}
}
最近のバージョンはファイルハンドルをres->bodyに渡せるのか。IO::Allとかもいけんのかな?