404 motivation not found | t_ishidaのブログ

12月/07

30

Webサーバーもどきを作ってみる

能書き

昨日Webサーバーが何しているか?っていう話を少しした。で、通信の話とかを一旦端折って、様々な機能を省略して一旦コードにしてみると分かり易いんじゃないかと思って簡単に書いてみた。通信の代わりにコマンドライン引数でやっている。

実際のWebサーバーとの違い。

  • これはコマンドライン引数でコマンドをもらうが、実際のWebサーバーは80番ポートでコマンドをもらう
  • これは出力先が標準出力になっているが、実際のWebサーバーは80番ポートに出力する。
  • これはコマンドラインからキックされたら起動するが、実際のWebサーバーは永久ループで通信を待っている。

遊び方

  1. 全部同じディレクトリに入れる
  2. こんなコマンドを打つ
    1. perl WebServer.pl GET index.html
    2. perl WebServer.pl GET “index.cgi?a=b&b=c&c=d”

これでhtmlが来たらhtmlが読み込まれて、cgiが来たら引数が環境変数に保存されて、perl側から使っているのが分かるはず。勿論、本物のWebサーバーは、エラー処理とか、テキストファイル以外の読み込みとか、追加機能用のモジュールを追加できたりとか色々しているけど、一番基本的なところは、これで見えるんじゃないかと。

WebServer.pl

use strict;
our %ENV;
my ( $cmd, $query ) = @ARGV;
##?で引数が付いているようならば、引数とファイル名を分ける
if( $query =~/^([^?]+)\?(.+)$/ ) {
$query = $1;
$ENV{'QUERY_STRING'} = $2;
}
##拡張子を判別する
$query =~/\.([^\.]+)$/;

##CGI用の拡張子か?
my %cgi_exts = ( 'cgi' => 1 , 'CGI' => 1 );
if( !$cgi_exts{$1} ) {
print "Content-type: text/html\n\n";
open F , $query;  print <F>; close F;
} else {
##Windows環境だと以下ね。
open F , $query; my @buf = <F>; close F;
shift(@buf) =~/#!(.+)$/;
print `$1 $query`;
##Windows環境じゃなければ
#print `$query`;
}
1;

index.cgi

#!c:\perl\bin\perl.exe
use strict;
use Data::Dumper;
print "Content-type: text/html", "\n\n";
print "<html><body>";
my $param = $ENV{'QUERY_STRING'};
my %params = ();
foreach my $pair( split( '&', $param ) ){
my($key , $value ) =  split(/=/,$pair);
$params{$key} = $value;
}
print "hello,cgi!!<br />\n" for 0..100;
print "<pre>";
print Dumper(\%params);
print "</pre></body></html>";
1;

index.html

<html>
<head>
		<title>
タイトル
</title>
	</head>
<body>
ようこそ
</body>
</html>
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< なんちゃってWebサーバー

PHP入門(初級編) >>

Find it!

Theme Design by devolux.org

Tag Cloud