AWK で作る CGI

基礎編


  1. はじめに
  2. CGI とは
  3. AWK では
  4. 環境変数
  5. スクリプトの出力
  6. 参考文献

応用編


  1. はじめに

    世の中に CGI スクリプトは溢れていますが、それらは大抵、perl で書かれています。 しかし、べつに perl でしか書けないわけではないのですから、 他の言語にも目を向けてあげてもいいじゃないか、という 趣旨ではありません。 むしろ、perl の普及は望ましいことですが、 あれはなかなか憶えることが多くて大変な言語ですから、 初心者にはもっと簡単な言語がいいのではないかという、老婆心です。 でははじめましょう。

    動作環境

    大変わがままで申し訳ありませんが、unix 上の gawk 3.0.3 +mb 1.11 に 話を限定 させていただきます。 もっと古いバージョンの gawk をお使いの方はこれを機会に最新版を インストールしましょう。

  2. CGI とは

    CGI とは、Common Gateway Interface のことです。 適当に訳すと「共通関門界面」(意味不明だ)。 要するに、やりとりのある web ページを提供できる仕掛けです。 具体的には、動かすプログラムには、環境変数を渡します。 プログラムはそれを見て、標準出力に書き込みます。 この枠組が利用できるなら、どのような言語を使っても構いません。

    ところで、CGI は Internet-Draft の段階で、RFC にはなっていないようです。 現在流通しているのは version 1.1 です。

    ついでに、HTTP の規格も読んでおきましょう。 HTTP 1.0 と HTTP 1.1 があります。 基本的に 1.0 に対応しておけば良いようです。

  3. AWK では

    前節で見たように、入力は環境変数を参照します。 POSIX 以降の awk には、ENVIRON という環境変数を扱う配列が用意されています。 普通に print すると、標準出力に書き込まれます。 よって、awk で CGI を利用することができます。

  4. 環境変数

    素直に CGI の draft を読んだ人は判ると思いますが、 unix では CGI の入力は環境変数で渡されます。

    これぐらい、あります。一番重要なのは QUERY_STRING です。 これが中心的な情報を教えてくれます。

    では、実例です。次のスクリプトを、スクリプトを入れておくディレクト リー (これは各自で設定しましょう。)に置きます。test0.awk と名付けましょう。


    
    #! /usr/local/bin/gawk -f
    
    BEGIN{
     print "Content-Type: text/plain"
     print ""
     print "This is test"
     print 1,ENVIRON["AUTH_TYPE"]
     print 2,ENVIRON["CONTENT_LENGTH"]
     print 3,ENVIRON["CONTENT_TYPE"]
     print 4,ENVIRON["GATEWAY_INTERFACE"]
     print 5,ENVIRON["PATH_INFO"]
     print 6,ENVIRON["PATH_TRANSLATED"]
     print 7,ENVIRON["QUERY_STRING"]
     print 8,ENVIRON["REMOTE_ADDR"]
     print 9,ENVIRON["REMOTE_HOST"]
     print 10,ENVIRON["REMOTE_IDENT"]
     print 11,ENVIRON["REMOTE_USER"]
     print 12,ENVIRON["REQUEST_METHOD"]
     print 13,ENVIRON["SCRIPT_NAME"]
     print 14,ENVIRON["SERVER_NAME"]
     print 15,ENVIRON["SERVER_PORT"]
     print 16,ENVIRON["SERVER_PROTOCOL"]
     print 17,ENVIRON["SERVER_SOFTWARE"]
    }
    

    勿論、実行権限を与えておいて下さい。 755 がよろしいでしょう。 それで、これのパスをブラウザーの Location のところ (GoTo とかかもしれない)に入れてみて下さい。 出てきた文字列の意味を以下で解説しましょう。 (というほどのことはないと思いますが)

    AUTH_TYPE

    ここには何も現れてなかったかも知れません。 認証が必要な時にここをチェックしましょう。 規格には Basic という type だけがあります。

    CONTENT_*

    POST メソッド(後述)で送られた情報を受けとる時に利用します。

    GATEWAY_INTERFACE

    CGI/1.1 と表示されていることでしょう。 1.2 とかになっていたら、この解説ではなく他のところを読んだ方が良いでしょう。

    QUERY_STRING

    重要だ、と言ったのにからっぽで意外な感じがするかも知れません。 これは、url の後ろに ? で始まる文字列を入れた時にそれがそのまま渡されるものです。ですから、

    http://www.hoge-u.ac.jp/cgi-bin/test.awk?foo=bar

    などとすると、test.awk に渡される QUERY_STRING が foo=bar になります。

    REMOTE_*

    実行させようとした人の情報が得られます。 組織の内部の人にしか実行させたくないなどという時に利用できるでしょう。

    REQUEST_METHOD

    要求に使った HTTP のメソッドです。 GET がよく使われます。 それから POST。 test.awk では GET と出ていたはずです。 QUERY_STRING はこれが GET の時に使うものなのです。

    SCRIPT_NAME

    もうこれは、動いているスクリプトの名前です。 (コンパイルされた c のプログラムでもスクリプトなのですが、 その辺りの用語の使い方は規格を参照して下さい。)

    SERVER_*

    CGI スクリプトを呼び出したサーバーの情報です。 SERVER_PROTOCOL は HTTP/1.0 か HTTP/1.1 だと思います。 どちらでも、CGI/1.1 で使えます。

  5. スクリプトの出力

    頭書き

    「頭書き」などという変な訳をつけてみましたが、英語では header です。 次のうち少なくとも一つは書かないといけません。

    Content-Type
    いわゆる MIME の Content-Type です。 典型的な例としては text/html や image/gif が挙げられます。
    Location
    別のページに飛びたい時などに使います。
    Status
    ブラウザーで見るのはエラーの時だけかも知れませんが、 3桁の数字とその説明文で、その文章がどういう性質のものかを表します (つまり、エラーの時はエラーだと教えるものです)。 詳しくは HTTP の規格書を見て下さい。 この Status という頭書きがなければ "200 OK" が指定されたとみなされます。

    これら以外に(要求が HTTP でされているならば) 任意の HTTP 頭書きを書いて構いません (Location を指定した時には書いてはいけませんが)。

    頭書きと本文の間

    こういう見出しを作るということが暗に何かあるということを示していますが、 頭書きと本文の間には必ず空行がなければいけません。

    本文

    何を書いても結構です。 但し、Content-Type と整合していることが必要です。 従って、Content-Type が指定されていなければ、本文は空でなければなりません。

  6. 参考文献

    1. HTTP / 1.0 [RFC1945]
    2. HTTP / 1.1 [RFC2068]
    3. CGI / 1.1 draft 第三版

質問メールは大歓迎ですが、 必ずしもお答えできる自信はありません(苦笑)