« Folksonomy + Taxsonomy | メイン | SebastianがMochikitをやらないか、と言ってる。 »

HTTP::Server::Simple::CGIの使い方

HTTP::Server::Simple::CGIのhandle_requestに渡される二つ目のパラメーターは、CGI.pmのオブジェクトです。ソースコード中の

sub handler {
    my $self = shift;
    my $cgi  = new CGI();
    eval { $self->handle_request($cgi) };
    if ($@) {
        my $error = $@;
        warn $error;
    }
}

で作成されてます。なので、handle_requestでは、

sub handle_request {
    my ($self,$q)=@_;
    $q->param('hoge');
    $q->header;
}

などとすることができますです。
ちなみに環境変数もセットしてくれるので、$ENV{'PATH_INFO'}なども取得可能です。便利。
CGI::Appなアプリケーションを動かす時は、CGI::Application用(デバッグ)サーバで書いた事とほぼ同じですが、

use base qw(HTTP::Server::Simple::CGI);
use HTTP::Status;
sub handle_request {
    my ($self,$q)=@_;
    local $ENV{CGI_APP_RETURN_ONLY} = 1;
    my $engine = MyApp->new(QUERY=>$q);
        my $ret = $engine->run();
    my $headers = $engine->_send_headers();
    my $message=200;
    foreach (split /\n/,$headers){
        if($_ =~ /^Status:\s+(\d+)/){
            $message=$1;
        }
    }
    print "HTTP/1.0 " . $message . " "  . status_message($message) . "\015\012";
    print $ret;
}

でいけると思う。

Dispatchの方は、dispatchメソッドをコピーしてくるのが早いかなぁ。

コメント

にゃるほど。
そんな感じで使うのですね。
勉強になります。
宮川さんの12 Thingsでこのモジュールを知りました。
HTTP::Server::Simpleを使ってCGI::App用デバッグサーバを簡単に作れるようにすれば結構いい感じになりそうですね。

HTTP::Server::Simpleは僕も宮川さんの記事で知りました。
ちなみにCatalyst::Engile::HTTPも
> Many parts are ripped out of HTTP::Server::Simple by Jesse Vincent.
なんて書かれていたりしますね。

コメントを投稿