CGIをテストする。

Apache*1入れればいいんだろうけど、めんどい*2ので、作ってみた。http://localhost:12345/で試せる。ただし全部GET*3。あと、多分CGI.pm使ってないとダメ。
とりあえず、今作ってるのは、これで大丈夫だから、まぁいっか、とか。

#! /usr/bin/perl
use strict;
use warnings;

my $script = $0 . ".cgi";

use Socket;
my $port = 12345;

socket( CLIENT_WAITING, PF_INET, SOCK_STREAM, 0 )
	or die "socket :$!";
setsockopt( CLIENT_WAITING, SOL_SOCKET, SO_REUSEADDR, 1 )
	or die "setsockopt :$!";
bind( CLIENT_WAITING, pack_sockaddr_in( $port, INADDR_ANY ) )
	or die "bind :$!";
listen( CLIENT_WAITING, SOMAXCONN )
	or die "listen :$!";

for(;;){
	my $paddr = accept( CLIENT, CLIENT_WAITING );
	select( CLIENT ); $|=1;

	my $request_line = <CLIENT>;
	my( $method, $query ) = ( $request_line =~ m|^(\w+)\s+[\w/\.\-\_]+\??([\w\.\-_=&%]*)\s+HTTP/\d+\.\d+| );
	my @querys = ($query)? split( /&/, $query ) : ();

	open CGI, "./$script " . join( ' ', @querys ) . " |";
	print "HTTP/1.1 200 OK\n";
	print while <CGI>;
	close CGI;
	close CLIENT;
}
__END__

参考 : http://x68000.q-e-d.net/~68user/net/
参考*4 : http://ja.wikipedia.org/wiki/Common_Gateway_Interface

*1:スペル間違えた。apatchとか書いたら、はてなのキーワードに引っかからなかった。

*2:というか、ハードディスクが空いてないですよ。

*3:CGIと双方向にやりとりできればいいんだけど…。ここらへん(http://perldoc.jp/docs/perl/5.6.1/perlfaq8.pod)を後で読む。

*4:というか、そのうち参考にするんじゃない、なとこ。