« CGI::AppでのDebugScreen | メイン | Folksonomy + Taxsonomy »

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

トラックバック

この一覧は、次のエントリーを参照しています: CGI::Application用(デバッグ)サーバ:

» CGI::Application用(デバッグ)サーバ from MT::Neko::kak 500 Internal Server Error
かぜぶろさんのとは異なり、 HTTP::Server::Simple::CGIで... [詳しくはこちら]