CGI::Application用(デバッグ)サーバ
CGI::Application用(デバッグの機能はまだない)サーバを作ってみた。
とりあえず動いた版ソース
CGI::Application::HTTP
↑アップロードしていたファイルが古いものでした。修正しました(2005-12-17 16:37)
使い方は、
package MyApp; use strict; use warnings; use base qw(CGI::Application::HTTP); package main; MyApp->new()->run(3000);
最後の3000はポート番号。これを
# perl server.pl You can connect to your server at http://example.com:3000
と出力されてPort 3000でCGI::Appが動きます。
ソースはほとんどCatalyst::Engine::HTTPからのコピーなんだけど、一部分に手を加えた
一つは、リクエストごとに$selfを別にするところで、最初のリクエスト前に
my %copy_of_self = %{$self};
としてコピーして、リクエストの処理時にblessして、それを使う
my $copy_of_self = bless \%copy_of_self,ref $self; my $output = $copy_of_self->SUPER::run();
無茶な手かもしれないけど、こうしておかないと、CGI::Appの__PARAMSや__HEADER_TYPEがクリアできずにGlobal変数的な動作をしてしまう。実際作成時にredirectループにはまりました。
二つ目は、CGI_APP_RETURN_ONLYの利用とstatus lineの出力。
これも無理矢理だけど、再度headerだけ出力させて「Status: 200 OK」のラインを探すということをしている。
$ENV{CGI_APP_RETURN_ONLY} = 1;
my $output = $copy_of_self->SUPER::run();
# Generate Status Line
my $message=200;
foreach (split /\n/,$copy_of_self->_send_headers){
if($_ =~ /^Status:\s+(\d+)/){
$message=$1;
}
}
print STDOUT $ENV{SERVER_PROTOCOL}. " " . $message . " " . status_message($message) . "\015\012";
print STDOUT $output;
status_messageはHTTP::Statusモジュールのメソッド。これで
HTTP/1.0 200 OK
を出力の頭につけれます。
三つ目はmode_paramの書き換え。
元のままだとうまく動かない。
CGI::App版TropyのCaropyを動かしてみたけどうまく動きました。