Catalyst::Plugin::Static::Simpleで

はまったので後々のためにメモ。

Catalyst::Plugin::Static::Simpleを使ってCSSjavascriptを静的に出力させようとしたところ、上手く出力されないという現状になった。該当のURLを入力してみたところ、

*Symbol::GEN_

アンダーバーの所は呼び出された回数で増えていきますが、このような表示が出る。HTTPヘッダーを見たところContent-Length等はファイルの内容がちゃんと反映されている模様。Content-Typeもtext/htmlになっているので問題はないのでちゃんとファイルは補足しているし、該当のファイルを出力するつもりではいる模様。

ファイルハンドルがそのまま出力されているのであろう感じなので、該当のモジュールのソースを確認してみた。



my $fh = IO::File->new( $full_path, 'r' );
if ( defined $fh ) {
binmode $fh;
$c->res->body( $fh );
}

ぬ、IO::Fileの場合、print <$fh>だったんじゃないかな?ということで、


use strict;
use IO::File;

my $file = '*****';

my $fh = IO::File->new( $file, 'r' );
if ( defined $fh ) {
binmode $fh;
print $fh;
print "\n";
}

としてみたところ出力結果はIO::File=GLOB(0x8174c28)該当のモジュールを使ったときとは違うけれども、どうやら$c->res->body()が上手く渡されたファイルハンドルを展開できていないのではないかと推測。とりあえず急場しのぎ的に、


my $fh = IO::File->new( $full_path, 'r' );
if ( defined $fh ) {
binmode $fh;
$c->res->body( join '',<$fh> );
}

とモジュールのソースを変更。ちなみにcatalystは5.6902、Catalyst::Plugin::Static::Simpleは0.14。OSはdebian、Sargeを基本にperlはTestingから導入で5.8.8。汎用性のある現象かどうかは不明。バッドノウハウである可能性は高いのでご注意を。