CGIで大ハマリ

今までいろいろCGIを作ってきて、CGIPerlも大抵のことは分かってるつもりだったんだけど、久しぶりに大ハマリしてしまった。

  • use CGIするとdieがCGI::Carp::dieに置き換わる(ことがある)

いつも全体をevalで囲ってデバッグにdieを使っているんだけど、突然例外を捕捉できなくなってInternal Server Errorになってしまう。フォームをenctype="multipart/form-data"で受け取るとこの現象が発生する。enctype="application/x-www-form-urlencoded"にすると起こらない。訳が分からないので二日ぐらい放っておいて改めて最小のテストコードを作って検証したら、new CGIした後にdieしても$@に値が設定されないということが分かった。これは$SIG{__DIE__}に&CGI::Carp::dieが代入されているため。そこでevalブロックと例外捕捉のコードを取り除いたら、CGI::Carp::dieがよきに計らってくれて、エラーメッセージがブラウザに表示された。こんなことなら最初からこれを使っておけば良かった。

  • フォームでファイルをアップロードするときのContent-Disposition:の値は環境によって微妙に異なる

filename属性に、Mozillaはパス名なしでファイル名だけ入れるけどIEはフルパスを入れる。ファイル名のサニタイズはやっていたんだけど、パスの区切りがバックスラッシュのWindows形式には対応してなくておかしなことになったので、それにも対応するように修正した。