フォームデータを別のCGIへパスするCGI
デモ(form.html→pass.cgi→hyouji.cgi)
二つのサーバーを借りていて、サーバーAのフォームからサーバーBのCGIへデータを渡す必要が有る場合に使える
CGIを考えてみました。但し、POSTでのデータ渡しでは出来ませんので、データの量は全角文字換算で400文字程度です。
サーバーAのサイトを公開していて、サーバーAにはsendmail機能が使えず、サーバーBにsendmail機能を利用したメール生成スクリプトを
置いているという状況を設定して作っています。
サーバーBから処理済のデータをサーバーAに送り返して、サーバーAで結果表示をすることによって、サーバーBのURLをほぼ隠すことが
出来ます(普通にIEでは履歴が残りません)。
サーバーBで、他サーバーから直接CGIを呼び出すことを許可していない場合は、使うことができません。
pass.cgi
#!/usr/local/bin/perl
# ************** pass.cgi ****************************************
#
# フォームからのデータなどを別のCGIにそのままパスするためのCGIです。
# CGI本体のURLを隠したいときなどに有効です。
# 添付データの長さの限界は全角文字に換算して490文字程度
#
#*****************************************************************
# 移動先のURLをフルパス指定します。
$go_url='hyouji.cgi';
#*****************************************************************
# データの読み込み
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else{ $buffer = $ENV{'QUERY_STRING'};}
$Buffer=substr($buffer,0,2000);
%form = &read_input($Buffer);
if($buffer eq ''){
# CGIを直に呼ばれた場合のインフォメーション
print "Content-type: text/html\n\n";
print "<html><head></head><body>このCGIは、フォームからのデータを受信して、別のCGIにリレーするスクリプトです。";
print "</body></html>";
}elsif(length($buffer)<=2000){
# フォームデータの量が適度な長さの場合、設定したCGIにデータを飛ばします。
print "Location: $go_url?$buffer\n\n";
}else{
# フォームに入力されたデータが長すぎるので、アラームを画面に出力して終ります。
$Buffer=~ s/</&st;/g;
$Buffer=~ s/>/>/g;
$Buffer =~ s/\n\r/<br>/g;
$Buffer =~ s/\r/<br>/g;
$Buffer =~ s/\n/<br>/g;
print "Content-type: text/html\n\n";
print "<html><head></head><body>$Buffer\ <hr>文書が長すぎます。400文字程度までが目安です。";
print "ブラウザのボタンで戻って内容を減らして再送信してください。</body></html>";
}
exit();
##############################################################
# # # read_input : フォームからのデータを分解し # # $form{'xxxx'} で返す。
# # # # 引数 1: 'euc' or 'jis' or 'sjis' # # #
##############################################################
sub read_input {
$Buffer = $_[0];
local (%FORM);
# Read in text
$Buffer =~ tr/+/ /;
$Buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#&jcode'convert(*Buffer, 'sjis');
%FORM;
}
__END__
form.html(上記サブルーチンをチェックするための簡単なフォーム)
<HTML>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=SHIFT_JIS" >
<HEAD>
<TITLE>FORM動作チェック</TITLE>
<STYLE>
</STYLE>
</HEAD>
<BODY bgcolor="pink">
<H3><FONT COLOR="blue">FORM動作チェック</FONT></H3>
<FORM ACTION="pass.cgi" METHOD="POST">
400字程度まで<BR>
<TEXTAREA NAME="text" COLS="70" ROWS="10" WRAP="soft">本日は晴天なり</TEXTAREA><BR>
<INPUT TYPE="submit" NAME="send" VALUE="送信"><BR>
</FORM>
</BODY>
</HTML>
hyouji.cgi(上記テスト用フォームからCGI経由でデータの受信をテストするCGI)
#!/usr/local/bin/perl
# ************** hyouji.cgi *************
# jcode.plを組み込む必要があります。PATHは、設置の環境により指定します。
require '../../lib/jcode.pl';
$me="hyouji.cgi";
#if ($ENV{'REQUEST_METHOD'} eq "POST"){
%form = &read_input('sjis');
#--------------------↓フォームデータ読み込み---------------------
$text =$form{'text'};
$send =$form{'send'};
#--------------------↑フォームデータ読み込み---------------------
#}
#--------------------↓ページの表示----------------------
print "Content-type: text/html\n\n";
&test_page;
exit();
#===================↓ここからサブルーチン=============================
sub test_page{
print <<"HIA1";
<HTML>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=SHIFT_JIS" >
<HEAD>
<TITLE>FORM動作チェック</TITLE>
<STYLE>
</STYLE>
</HEAD>
<BODY>
<!------------------------↓CGIが受け取ったデータの記述箇所-------------------->
pass.cgi経由で受信したデータの表\示。<BR>
<TEXTAREA NAME="text" COLS="70" ROWS="10" WRAP="soft">$text</TEXTAREA><BR>
<BR>
その他の情報。<BR>
<TABLE BORDER="1" CELLSPACING="0">
<TR><TD>send</TD><TD>$send</TD></TR>
<TR><TD>HTTP_REFERER</TD><TD>【$ENV{'HTTP_REFERER'}】</TD></TR>
</TABLE>
<!------------------------↑CGIが受け取ったデータの記述箇所-------------------->
</BODY>
</HTML>
HIA1
}
##############################################################
# # # read_input : フォームからのデータを分解し # # $form{'xxxx'} で返す。
# # # # 引数 1: 'euc' or 'jis' or 'sjis' # # #
##############################################################
sub read_input {
$charset = $_[0];
$charset = 'euc' if ( $charset eq '' );
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else{ $buffer = $ENV{'QUERY_STRING'};}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, $charset);
$FORM{$name} = $value;
}
%FORM;
}
__END__
2006.01.21
[HOME][とまて週報TOP]