フォームデータを別の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/>/&gt;/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]