CGI
CGI は、ASP が出てくる以前は、長い間、Web アプリケーションを設置する標準的な方法でした。
CGI ゲートウェイの世界では、CGI.pm が CGI アプリケーション構築に、
広く使われたモジュールであり、Apache::ASP でも、CGI.pm を用いた、
スクリプトに互換性があるようになっています。
また、Version 2.19 からは、Apache::ASP は、
mod_perl が利用できない、
Apache Web サーバでも、スタンドアローンの CGI モードで運用できるようになりました。
下段の "Standalone CGI Mode" セクション参照してください。
以下は、CGI と CGI.pm との互換性に関する特記すべきノートです。
CGI.pm を使うことができるようになるには、多少なりとも、
仕事量が大きくなりますし、他の Perl ASP を実行する上で、
互換性を保証されるものではなく、限界もあることも起こりうることです。
mod_perl なしのスタンドアローンな CGI モード
version 2.19 で、Apache::ASP スクリプトは、
スタンドアローンな、CGI スクリプトとして、
Apache (サーバ)に、mod_perl が組み込まれていなくても稼動するようになりましたが、
Unix プラットフォームの Apache で、mod_cgi
で動いていたスクリプトも、他の Web サーバないし Win32 オペレーティングシステムでは、さらなる改変をしなければ、多少なりとも違った動き方になるでしょう。
CGI スクリプトとして、./site/eg スクリプトを動かすには、
./site ディレクトリを、Web サーバがアクセスできる、適当な場所にコピーしてください。
ここの例では、/usr/local/apache/htdocs/aspcg にあるものとします。
httpd.conf で、Apache::ASP CGI スクリプトを始動するには
以下のようにします。
Alias /aspcgi/ /usr/local/apache/htdocs/aspcgi/
<Directory /usr/local/apache/htdocs/aspcgi/eg/ >
AddType application/x-httpd-cgi .htm
AddType application/x-httpd-cgi .html
AddType application/x-httpd-cgi .asp
AddType application/x-httpd-cgi .xml
AddType application/x-httpd-cgi .ssi
AllowOverride None
Options +ExecCGI +Indexes
</Directory>
次に、ディストリビューションから、CGI と ASP スクリプトを、
インストールした、./site/eg ディレクトリにコピーします。
以下のように、これらのスクリプトの冒頭ラインに書くと、
ASP ラッパが動くようになります。
#!/usr/local/bin/perl asp
(この)ASP スクリプトは、通常の mod_perl ハンドラリクエストの代りに、
Apache::ASP 環境で、CGI ラッパとして設定されます。
mod_cgi では、Apache->dir_config() データが得られないので、
ASP スクリプトは、dir_config() データをハッシュ化させた %Config のデータに
埋め込ませるように asp.config ファイルを読み込むようにしています。
複雑な、asp.config ファイルの実例は、./site/eg/asp.config に示します。
普通の、asp.config フィルは、以下のようになることでしょう。
# asp.config
%Config = (
'Global' => '.',
'StateDir' => '/tmp/aspstate',
'NoState' => 0,
'Debug' => 3,
);
NoState のデフォールトは、CGI モードでは、1 ですが、
$Session & $Application のようなオブジェクトが定義されているように、
0 にセットしてください。
CGI.pm
CGI.pm は、非常に有用なモジュールで、開発者が、アプリケーション構築のさい、
手助けになっていますので、Apache::ASP でも、
CGI.pm でコールされる関数と互換性があるようにしました。
ほとんど CGI で書かれた ASP スクリプトのサンプルとして、
./site/eg ディレクトリにある
cgi.htm をご覧ください。
version 0.09 で、Apache::ASP で働く場合、
CGI.pm の使用では、入力、出力ともに継ぎ目なく行われるようになりました。
既存の、CGI スクリプトを、Apache::ASP へ移植したい時は、
<% %> でスクリプト実行部分を包み込まなければなりません。
この機能の実装で、開発者は、Web アプリケーション構築する上で、
両方の領域のベスト(な部分)を持てることになります。
問い合わせオブジェクト初期化
CGI.pm $query オブジェクトは、次のように作成することが出来ます。
use CGI;
my $query = new CGI;
Apache::ASP version 0.09 で、フォーム入力が、
CGI.pm で初期化されたものに上書きされて、読み込まれるようになりました。
以前は、Apache::ASP は、$Request->Form() へ読み込まれる時に、
フォーム入力(の値)を、消滅させていましたが、
現在は、フォーム入力はキャッシュされ、CGI.pm の入力ルーチンにて、
使用されます。
CGI ヘッダ
ヘッダの機能は停止されるが、CgiHeaders 設定オプションを、
真にセッティングするために、
CGI.pm $query->header() メソッドを使用できるだけでなく、
print "Header: value\n" として、
以下のような行をスクリプトの先頭に追加することもできます。
Some-Header: Value
Some-Other: OtherValue
<html><body> スクリプトの本体がここから開始
CGI スタイルのヘッダがないか、あるいは、改行がなければ、
ただちにスクリプト本体が開始されます。
それで、以下のような、ASP スクリプトがありますと、
print join(":", %{$Request->QueryString});
行は、セミコロンがあるのでヘッダとして解釈され、
出力なしに終わることになります。
<html> でページをスタートするかぎり、
基本的なデバグの際には、この問題を避けるようにしてください。
CGI におけるprint()
CGI では、print() 命令文が、よく知られていますし、
CGI.pm の関数は、通常、print() の文字列戻り値になっています。
Apache::ASP でも、$Response->Write() の別名になっていますので、
使用できます。$| は効果がないことに注意してください。
print $query->header();
print $query->start_form();
File アップロード
CGI.pm は、ファイルをアップロードし、フォーム入力を読み込む実装が、
よく使われます。望みのままに、ファイルアップロードフォームを
作ることができるので、$Request->Form() を使って、
アップロードしたファイルから、データをリカバリできます。
ファイルアップロードからのデータは、ファイルハンドルへと書き込まれ、
次には、(ファイルハンドルから)読み込まれます。
アップロードされた、元のファイル名は、ファイルハンドルの名前になります。
my $filehandle = $Request->Form('file_upload_field_name');
print $filehandle; # ファイルの名前を示す。
my $data;
while(read($filehandle, $data, 1024)) {
# アップロードされたファイルからのデータを $data へ書き込む
};
このトピックの詳細情報は、CGI.pm のドキュメントを見てください。
(perldoc CGI と試してください)
使用法の実例は、./site/eg/file_upload.asp を見てください。
ファイルアップロードでの詳細データを使っての、
$Request->FileUpload() API 拡張(例)を示します。
以下のプロパティは、問い合わせ時に、使用できます。
my $file_upload = $Request->{FileUpload}{upload_field};
$file_upload->{BrowserFile}
$file_upload->{FileHandle}
$file_upload->{ContentType}
# FileUploadTemp がセットされている場合のみ
$file_upload->{TempFile}
# ファイルアップロードで、MIME ヘッダが送出されると
# 必ず、"keys %$file_upload" が調べられる。
$file_upload->{?Mime-Header?}
詳細情報は、オブジェクト での
$Request セクションを見てください。