判明しているex0chのFastCGI化にあたっての障害
前提
FastCGIを導入するにあたっては、FCGIモジュールのインストールが必要となる。
FCGIの問題点
Unicode非対応
https://metacpan.org/release/BOBTFISH/FCGI-0.71_01/view/FCGI.PL より翻訳
FCGI.pm は Unicode を認識せず、0x00 ~ 0xFF の範囲内の文字のみがサポートされます。 0xFF より上の文字を含む文字列を出力しようとすると、例外が発生します: (F)
Wide character in %s.以前 (FCGI.pm <= 0.68) の誤った動作を望むユーザーは、次のコマンドを使用して例外を無効にできます。
bytesプラグマ。{
use bytes;
print "\x{263A}"; }
binmodeによるPerl IOレイヤーの適用ができない
https://stackoverflow.com/questions/5005104/how-to-force-fastcgi-to-encode-form-data-as-utf-8-as-cgi-pm-has-option より翻訳
gitweb: CGI::Fast 使用時の UTF-8 エンコーディングの修正 署名者: Julien Moutinho
FCGI ストリームは古いストリーム API を使って実装されています: そのため、binmode() を使って PerlIO レイヤーを適用しても効果がありません。 このパッチの解決策は、FCGI::Stream::PRINT 関数を再定義して出力エンコーディングに UTF-8 を使用するようにすることです。ただし、git_blob_plain() や git_snapshot() ではまだ生のバイナリモードで出力する必要があります。
この問題と解決策は 2012 年に報告されています:
つまり、FastCGIを有効にする場合に限って
use open IO => ':encoding(cp932)';
binmode(STDOUT,':encoding(cp932)');
や
use open IO => ':std', ':encoding(UTF-8)';
などと記述してあっても文字化けが起こりうる。
一応、各ファイルストリームや標準入出力に対して逐一decodeやencodeすることで回避可能だが、単純に手間なのと、入れ忘れによる文字化けなんかがあると面倒くさい。
ex0ch側の問題
新しく追加された機能に関して、変数の初期化が完全でない箇所がいくつかある。
FCGI側の問題は解決
ex0ch側 bbs.cgi: Use of uninitialized value in string ne at ./module/slip.pl line 341. bbs.cgi: Argument "544e63e7" isn't numeric in addition (+) at ./module/slip.pl line 370. bbs.cgi: Use of uninitialized value in string eq at ./module/post_service.pl line 232. bbs.cgi: Use of uninitialized value in string eq at ./module/post_service.pl line 232. bbs.cgi: Filehandle $fh opened only for output at ./module/log.pl line 146. bbs.cgi: Use of uninitialized value in split at ./module/post_service.pl line 627. bbs.cgi: Use of uninitialized value $nusisid in string ne at ./module/post_service.pl line 235. bbs.cgi: Use of uninitialized value $ninLv in numeric ge (>=) at ./module/post_service.pl line 261. bbs.cgi: Use of uninitialized value in string eq at ./module/user.pl line 244. bbs.cgi: Use of uninitialized value $nusisid in string eq at ./module/post_service.pl line 307.
一通り修正完了