Hippo2000 (2000/7/28)
HTTP::Daemonモジュールなのです。
作者はGisle Aasさんです。メールで許可をいただきました。
HTTP::Daemon - 簡単なhttpサーバクラス
use HTTP::Daemon; use HTTP::Status;
my $d = new HTTP::Daemon;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
while (my $r = $c->get_request) {
if ($r->method eq 'GET' and $r->url->path eq "/xyzzy") {
#これは実際には推奨され*ない*ということを忘れないで下さい:-)
$c->send_file_response("/etc/passwd");
} else {
$c->send_error(RC_FORBIDDEN)
}
}
$c->close;
undef($c);
}
HTTP::Daemonのインスタンスは、リクエストがやってくるソケットをlistenするHTTP/1.1サーバです。HTTP::DaemonはIO::Socket::INETクラスのサブクラスです。そのため直接ソケット操作を行うことも出来ます。
accept()メソッドはクライアントからの接続が利用可能になると、返ります。返された値はHTTP::Daemon::ClientConnクラスのオブジェクトへのリファレンスで、それはもう1つのIO::Socket::INETのサブクラスです。このオブジェクトにget_request()メソッドを呼ぶと、クライアントからデータを読み込み、HTTP::Requestオブジェクト・リファレンスを返します。
このHTTPデーモンはあなたの代りにfork(2)をしません。あなたのアプリケーション、つまりHTTP::Daemonのユーザは、欲しいのであればフォークすることに責任を持たなければなりません。またユーザはHTTP/1.1プロトコルにしたがったレスポンスを作成することに責任を持たなければなりません。HTTP::Daemon::ClientConnは簡単にするためにいくつかのメソッドを提供します。
以下にIO::Socket::INET基本クラスとの比較で、新しい(もしくは拡張された)メソッドの一覧を示します:
$d = new HTTP::Daemon
LocalAddr => 'www.someplace.com',
LocalPort => 80;
HTTP::Daemon::ClientConn もIO::Socket::INET のサブクラスです。このクラスのインスタンスはHTTP::Daemon.のaccept()メソッドにより返されます。以下の追加のメソッドが提供されます:
$c->get_request メソッドはフッタのついたチャンクされた転送エンコーディングと自分で区切るmultipart/* コンテント・タイプも含めて、HTTP/1.1リクエスト コンテント・ボディをサポートします。
$c->get_request メソッドは通常はすべてのリクエストがクライアントから受信できるまで戻りません。もしリクエストが数メガバイトのファイルをアップロードする(そしてチャンクされた転送エンコーディングでHTTPが無限のリクエストメッセージをサポードすること−例えばライブな音声のアップロード−が出来たとしても)のであれば、これは望ましいことではないかもしれません。$headers_only引数としてTRUEを渡すと、$c->get_requestは、リクエスト・ヘッダを解析するとすぐに戻ります。そしてリクエスト内容の残りを読むかどうかの責任はあなたにあります。もし同じ接続に$c->get_requestを再び呼び出せば、正しいバイト数を読み込みます。
あなた自身でリクエストのコンテントの読み込みを扱うならば、さらに読み込む前にはこのバッファを空にする必要があります。そして消費されないバイトをここに置く必要があります。101 Switching Protocols. のようなサービスを実装するのであっても、このバッファが必要です。
このメソッドは常に古いバッファの内容を返します。引数を渡せば、オプションでバッファを置きかえることも出来ます。
属性はクライアント・プロトコルがHTTP/1.0またはそれより悪く、"Connection;"、"Keep-Alive"ヘッダを含まないといっていれば、この属性は自動的にONに切り替わります。またHTTP/1.1またはそれよりもよいクライアントが"Connection:close"リクエスト・ヘッダを送信するとき自動的にONに切り替わります。
HTTP::Response オブジェクトのcontent属性は通常の文字列またはサブルーチン・リファレンスにすることができます。もしサブルーチンであれば、このコールバック・ルーチンが返すものは何であれ、レスポンス・コンテントとしてクライアントに書き戻されます。ルーチンはそれが未定義あるいは空の値を返すまで呼ばれます。もしクライアントがHTTP/1.1がわかれば、レスポンスにチャンクされた転送エンコーディングを使います。
RFC 2068
IO::Socket, Apache
Copyright 1996-1998, Gisle Aas
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。