init III
This commit is contained in:
145
Windows Webserver via Perl/wawrun.pl
Normal file
145
Windows Webserver via Perl/wawrun.pl
Normal file
@@ -0,0 +1,145 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use POE;
|
||||
use POE::Kernel;
|
||||
use POE::Loop::Select;
|
||||
use POE::Resource;
|
||||
use POE::Resource::Aliases;
|
||||
use POE::Resource::Events;
|
||||
use POE::Resource::Extrefs;
|
||||
use POE::Resource::FileHandles;
|
||||
use POE::Resource::SIDs;
|
||||
use POE::Resource::Sessions;
|
||||
use POE::Resource::Signals;
|
||||
#use POE::Resource::Statistics;
|
||||
use POE::Component::Server::TCP;
|
||||
|
||||
use strict;
|
||||
|
||||
my $logfile = './waw.log';
|
||||
my $configfile = './waw.conf';
|
||||
my $def_index = "index.html";
|
||||
my $def_port = 88;
|
||||
my $def_htdocs = './htdocs/';
|
||||
my %filetype = (htm=>'HTML', html=>'HTML', pl=>'PERL', php=>'PHP'); # extension => type
|
||||
my %interpreter = (PERL=>'/usr/bin/perl');
|
||||
|
||||
# turn on autoflush
|
||||
$|=1;
|
||||
|
||||
TCPServer ();
|
||||
POE::Kernel->run();
|
||||
|
||||
sub Log {
|
||||
my $msg = shift;
|
||||
open(my $f, ">>$logfile") or die $!;
|
||||
print $f "$msg";
|
||||
close $f;
|
||||
print "$msg";
|
||||
}
|
||||
|
||||
sub TCPServer {
|
||||
#my %daten=%{$_[0]};
|
||||
POE::Component::Server::TCP->new(
|
||||
Alias => "SERVER",
|
||||
Port => $def_port,
|
||||
ClientInput => sub {
|
||||
my ($session, $heap, $input) = @_[SESSION, HEAP, ARG0];
|
||||
print "$input\n";
|
||||
# GET /index.html HTTP/1.1
|
||||
if ($input =~ /GET|POST.*HTTP/) {
|
||||
my $file="";
|
||||
my $param="";
|
||||
my $method="";
|
||||
($method, $file) = $input =~ /(GET|POST) \/(.*) HTTP/; # lese anzuzeigende datei aus GET aus
|
||||
# GET,POST abfangen
|
||||
if ($file =~ /\?/) {
|
||||
($file,$param) = $file =~ /(.*)\?(.*)/;
|
||||
}
|
||||
if ($file eq "") { # wenn keine datei angegeben standard datei öffnen, normalerweise index.html
|
||||
$file = $def_index;
|
||||
}
|
||||
$file = "$def_htdocs$file";
|
||||
|
||||
Log ("$method $file;");
|
||||
|
||||
my $senddata;
|
||||
my $error=0;
|
||||
my @ausgabe=();
|
||||
if (-e "$file") { # existiert angeforderte datei diese öffnen
|
||||
Log("OK\n");
|
||||
# Dateityp?
|
||||
my $type = checkfiletype($file);
|
||||
if ($type ne "UNKNOWN") {
|
||||
@ausgabe = interpret ($type, $file, $param);
|
||||
}
|
||||
else {
|
||||
Log("Type of file unknown\n");
|
||||
}
|
||||
#$heap->{client}->put($input);
|
||||
}
|
||||
else { # fehler 404 wenn datei nicht existiert
|
||||
$senddata = error_html("404 Not found!");
|
||||
Log("404\n");
|
||||
$error=1;
|
||||
}
|
||||
|
||||
# Datei ausgelesen und kein Fehler
|
||||
if (!$error) {
|
||||
# Parsen auf perl Tags
|
||||
$senddata = parseperl(@ausgabe);
|
||||
}
|
||||
# Ausgabe zum Browser senden
|
||||
print "###\n$senddata\n###\n"; ##########################
|
||||
$heap->{client}->put("Content-type: text/html\n");########################
|
||||
$heap->{client}->put("$senddata\n");
|
||||
$_[KERNEL]->yield("shutdown");
|
||||
}
|
||||
else {
|
||||
#$heap->{client}->put($input);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
sub error_html {
|
||||
return "<html>\n<body>\n<h1>$_[0]</h1>\n</body>\n</html>\n";
|
||||
Log ()
|
||||
}
|
||||
|
||||
sub parseperl {
|
||||
my $ret;
|
||||
foreach (@_) {
|
||||
$ret.=$_;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub checkfiletype {
|
||||
my $type = '';
|
||||
my $ext;
|
||||
($ext)=$_[0]=~/\.(.*)?/;
|
||||
$type = $filetype{$ext};
|
||||
$type = 'UNKNOWN' if($type eq '');
|
||||
return $type;
|
||||
}
|
||||
|
||||
sub interpret {
|
||||
# Übergabe Filetype, File, Parameter
|
||||
my @ausgabe;
|
||||
if ($_[0] eq 'HTML') {
|
||||
open HTML, "<$_[1]";
|
||||
foreach (<HTML>) {
|
||||
push(@ausgabe, $_);
|
||||
}
|
||||
close HTML;
|
||||
}
|
||||
else {
|
||||
#Parameter auseinander nehmen und per Kommandozeile wieder übergeben
|
||||
#name=inhalt1&name2=inhalt2....
|
||||
my @parameter = split /&/, $_[2];
|
||||
#print "\n\n @parameter\n\n";
|
||||
@ausgabe = `$interpreter{$_[0]} $_[1] @parameter`;
|
||||
}
|
||||
return @ausgabe;
|
||||
}
|
||||
Reference in New Issue
Block a user