なんとなく書いてみました。リファラやユーザエージェントとかそんなものは環境変数として取得できませんしForkもしません。とりあえず動かして一対一でHTMLファイルや画像ファイルを表示するだけです。ファイヤウォールを外せば他のパソコンからも閲覧できたりします。(危ないのでやらないようにw)
#!/usr/bin/perl -w
use FindBin;
use Socket qw/sockaddr_in inet_ntoa/;
use HTTP::Daemon;
use HTTP::Status;
# バッファリングしない
local $| = 1;
# 公開パス
my $public_path = "$FindBin::Bin"."/public_html";
my %in; # ブラウザからデータを受け取るハッシュを初期化
my $daemon = HTTP::Daemon->new(LocalAddr => '',LocalPort => "8080");
print "START SERVER $public_pathn";
while (my ( $client, $peer_addr ) = $daemon->accept){ # メインループ
my ( $port, $iaddr ) = sockaddr_in($peer_addr); # PortとIPを取得する
my $remote_addr = inet_ntoa($iaddr); # バイナリ状態のIPを変換する
print "Access IP: $remote_addrn";
while (my $request = $client->get_request){ # リクエスト処理ループ
if ($request->method eq 'GET'){
my $resource = $request->url->path;
# GETで送られてきた情報を取得
my $get_request = $request->url;
my $get_data = ""; $get_data = $1 if($get_request =~ m/.*?(.+)/);
&get_form($get_data) if($get_data);
print "---> PATH: $resource GET: $get_datan";
foreach my $key (keys (%in)){print "------> HASH: $key -> $in{$key}n";}
if($resource =~ m/^/-_-/){ # インフォメーションページ
my $header = HTTP::Headers->new( 'Content-Type' => 'text/html' );
my $res = HTTP::Response->new( 200, 'OK', $header );
$client->send_response($res);
print $client "日本語でおk? PATH: $resource GET: $get_data IP: $remote_addrn";
}elsif($resource =~ m//$/){ # ファイル名を省略していたらとりあえず"index.html"を表示する
$client->send_file_response($public_path.$resource."index.html");
}else{ # それ以外はファイルを探して表示
$client->send_file_response($public_path.$resource);
}
}
}
$client->close;
}
sub get_form{
%in = (); my ($get_data) = @_ ;
foreach my $data (split(/&/, $get_data)) {
my ($key, $value) = split(/=/, $data);
$value =~ s/+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
$value =~ s/t//g;
$in{"$key"} = $value;
}
}
ブラウザで適当にhttp://127.0.01:8080/-_-/ でアクセスすれば下記のような返答があると思います。
日本語でおk? PATH: /-_-/ GET: IP: 127.0.0.1
最近のコメント