なんとなく書いてみました。リファラやユーザエージェントとかそんなものは環境変数として取得できませんし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
0 Comments.