#!/usr/bin/perl -w

require 5.004;
use IO::Socket;

$EOL = "\015\012";
$getcomm = "GET";
$defaultname = "index.html";

my ($remote,$port, $iaddr, $paddr, $proto, $line);

# use 1st parameter or default port;
$port   = shift || 9876; 

$proto   = getprotobyname('tcp');

# socket() & bind() & listen()
$server = IO::Socket::INET->new( Proto     => 'tcp',
								 LocalPort => $port,
								 Listen    => SOMAXCONN,
								 Reuse     => 1);

die "can't setup server" unless $server;
print "Server started\n";

# serve one client at a time
while($client = $server->accept()) {
	$client->autoflush(1);
	print "Connection from ", $client->peerhost;

	while (<$client>) {
		# read request
		s/$EOL|\n//g;	# remove NL
		next unless (/\S/); # skip empty lines
		($comm, $docname, undef) = split;
		last if ($comm eq $getcomm);
		print $client "400 Bad Request $EOL";
	}

	if ($comm ne $getcomm) {
		close $client;
		next;
	}

	# process docname

	# remove .. ~ $
	$docname =~ s/\.\.|\~|\$//g;

	# replace trailing / with /$defaultname
	$docname =~ s/\/$/\/$defaultname/g;

	# remove front / (one or more)
	$docname =~ s/^\/*//g;

	print " $comm $docname\n";

	if (! (open IF, $docname)) {
		print $client "404 Not found $EOL";
		close $client;
		next;
	}

	print $client $EOL; # empty line (after headers)
	
	while(<IF>) {
		chop;
		$ok = print $client $_, $EOL;
		last unless ($ok);
	}
	close IF;
	close $client;
}

	

