Files
2024-10-14 00:08:40 +02:00

146 lines
3.5 KiB
Perl

#!/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;
}