Perl - はじめての CGI

正直、CGI が何の事だか分かっていないので実際に動かしてみる。

CGI = HTTP サーバから環境変数とかでリクエストの内容をもらい、標準出力を通じてHTTPサーバにレスポンスを返す仕組み

と理解しとこう。

% sudo apt-get install apache2
% sudo chmod 777 /usr/lib/cgi-bin
% vim /usr/lib/cgi-bin/hello.pl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

print "Content-type: text/plain\n\n";
print "Hello, world.\n";
print Dumper(\%ENV);
print Dumper(\@ARGV);
print join('', <STDIN>);
% chmod +x /usr/lib/cgi-bin/hello.pl
% wget -qSO - --post-data 'this is post data' 'http://localhost/cgi-bin/hello.pl?key=value'  
  HTTP/1.1 200 OK
  Date: Mon, 04 Mar 2013 15:38:31 GMT
  Server: Apache/2.2.22 (Ubuntu)
  Vary: Accept-Encoding
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Transfer-Encoding: chunked
  Content-Type: text/plain
Hello, world.
$VAR1 = {
          'SCRIPT_NAME' => '/cgi-bin/hello.pl',
          'SERVER_NAME' => 'localhost',
          'SERVER_ADMIN' => 'webmaster@localhost',
          'HTTP_CONNECTION' => 'Keep-Alive',
          'REQUEST_METHOD' => 'POST',
          'CONTENT_LENGTH' => '17',
          'HTTP_ACCEPT' => '*/*',
          'SCRIPT_FILENAME' => '/usr/lib/cgi-bin/hello.pl',
          'SERVER_SOFTWARE' => 'Apache/2.2.22 (Ubuntu)',
          'QUERY_STRING' => 'key=value',
          'REMOTE_PORT' => '42423',
          'HTTP_USER_AGENT' => 'Wget/1.13.4 (linux-gnu)',
          'SERVER_PORT' => '80',
          'SERVER_SIGNATURE' => '<address>Apache/2.2.22 (Ubuntu) Server at localhost Port 80</address>
',
          'REMOTE_ADDR' => '127.0.0.1',
          'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
          'SERVER_PROTOCOL' => 'HTTP/1.1',
          'PATH' => '/usr/local/bin:/usr/bin:/bin',
          'REQUEST_URI' => '/cgi-bin/hello.pl?key=value',
          'GATEWAY_INTERFACE' => 'CGI/1.1',
          'SERVER_ADDR' => '127.0.0.1',
          'DOCUMENT_ROOT' => '/var/www',
          'HTTP_HOST' => 'localhost'
        };
$VAR1 = [];
this is post data
  • Content-type だけ書けば、残りの header は apache が補ってくれそう。
  • 環境変数にリクエストの内容が大体入ってくる。
  • リクエストボディーは標準入力から渡される。
  • ARGV は使わない?

とわかった。