#!/usr/bin/perl
# karakurt - pure perl httpd v0.01.04 (c) mahatma, GPLs
=head1 NAME
phttpd-0.01.04.pl - karakurt, small pure Perl httpd ([x]inetd or standalone).
=head1 DESCRIPTION
Small pure Perl httpd, only Perl CGI, faster Perl CGI execution.
Nice for configuration/single Perl CGI purposes.
=head1 README
karakurt, pure Perl httpd v0.01.04 (c) Dzianis Kahanovich, GPLs
This software are with NO WARRANTY!
I wrote it becouse I needs for small, fast, all-in-one httpd/perl, main -
in xinetd. There are my first server sockets programming (daemon/standalone),
then standalone mode are totally experemental, but caching modes are much more
experemental and unsecure and unsafe. Use it only for debugged, verifyed
scripts set. Also eXtreme mode must be not used with wildcard redirections:
every new URI will creating new cache entry. For real tasks even non-cached
mode are fast as perl "eval" method. But if you have commercial ;) heavy-loaded
perl-only site and if my daemon/forking model satisfy you (heh) - you may
trying eXtreme mode. But all software are with NO WARRANTY and all
PROBLEMS ARE YOUR OWN RISC!!
Configuration:
Look to %map variable and comments. There are regular expression/substitution.
Also try suexec file mode bits. I think, with mind you may build good security
for YOUR site (I not think that may be used in multi-user mode, but may be yes,
may be no - I trying to care for minimal security in non-cached mode, but not
believe in this).
Virtual hosts: use $ENV{'HTTP_HOST'} in %map target.
Do not put "tar" into %mime - you will get auto-ungzipping in your browser
(encoding). I experienced about "binary/unknown" are good content-type for
all binary downloads and real situations.
Also: while all CGI scripts running via "eval" - all Perl comman dline options
in scripts will be ignored.
May be easy added cool features in daemon (transparent compressing, etc), but
with price of unsimplifying code. Now it is minimal and functional and primary
will be used (by me) in LAN & localhost.
=head1 PREREQUISITES
Perl 5 (tested with 5.8.6 only)
=head1 COREQUISITES
Perl 5, no modules (xinetd). Sockets (for daemon mode only).
=pod OSNAMES
All
=pod SCRIPT CATEGORIES
Web
=cut
my (%OPTIONS,@RANGE);
sub httpd{
# 'id|options mask'=>sub{"[user:group]file"}
# 'id|options mask'=>sub{"file"}
my %map=(
'00 \.\.'=>sub{"404"},
'03 /html/(.*)'=>sub{"html/$1"},
# '22xr /usr/portage/distfiles/.*'=>sub{"gcache-0.01.cgi"},
'44x ..*'=>sub{"404"}
);
my %mime=(
'html'=>'text/html',
'htm'=>'text/html',
'js'=>'text/javascript',
'gif'=>'image/gif',
'jpg'=>'image/jpeg',
'gz'=>'application/x-gzip'
);
my %mime_enc=( # to prevent "content-encoding" just remove real type from mime
'gz'=>'gzip'
);
my $version='0.01.04';
my $server="karakurt";
my $root=substr($0,0,rindex($0,'/'));
my ($content,%contents,%contents_uri,$file,@errors,$mainpid,@guid);
$ENV{'REMOTE_ADDR'}=$ENV{'REMOTE_HOST'};
$ENV{'SERVER_PROTOCOL'}='HTTP/1.0';
$ENV{'SERVER_SOFTWARE'}="$server/$version";
$ENV{'SERVER_SIGNATURE'}="