読者です 読者をやめる 読者になる 読者になる

ECMAScriptサブセットDMonkeyでCGI その2 リクエストを受け取る

今回はクライアントからのフォームを通じてのリクエストを受け取ってみます。

dm.exeと同じディレクトリに置くcgi.dms

  • どこからでもimportできるようにdm.exeと同じディレクトリに置く
  • CGIがリクエストを受け取る仕組みについてはここを参考にした
  • 環境変数を取得するメソッドWSHを利用
  • POST,GET,PATH_INFOはあらかじめ配列にしておく
// cgi.dms

// 環境変数を取得するメソッド
var getEnv = WScript.CreateObject('Wscript.Shell').Environment('Process');

// 生のリクエストデータ
var request = { POST : read( getEnv('CONTENT_LENGTH')),
                GET : getEnv('QUERY_STRING'),
                PATH_INFO : getEnv('PATH_INFO')
};

// 文字列をハッシュにして返す
function parse( str){
    str = str.replace(/\+/g,' ');
    var items = str.split('&');
    var n,_ = {},pair;
    for( n in items){
        pair = items[n].split('=');
        _[ decodeURI( pair[0])] = decodeURI( pair[1]);
    }
    return _;
}

// GETのハッシュ
var GET = parse( request.GET);

// POSTのハッシュ
var POST = parse( request.POST);

// PATH_INFOの配列
var PATH_INFO = (function (){
    var p = request.PATH_INFO.split('/');
    p.shift();
    return p;
})();

実際にアクセスするtest.dms

  • cgi.dmsをインポート
  • フォームを表示
  • POST['test']があれば表示
import cgi;

print("Content-type:text/html\n\n");

print('
<html><head>
<title>test.dms</title>
</head><body>
<form method="POST" action="test.dms">
<input name="test" size="20" /><br/>
<input type="submit" />
</form>
');

if( cgi.POST.hasKey('test'))
{
    println('cgi.POST[test] : ' + cgi.POST.test + '<br/>');
}

print('
</body></html>
');

試してみる


アクセスして文字を打ち込んでます

POSTメソッドで送ったリクエストがきちんと表示されています。