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を動かしてみたけどうまく動きました。