#!/usr/bin/env perl

use strict;
use warnings;

use HTTP::Daemon    qw[];
use HTTP::Response  qw[];
use HTTP::Status    qw[RC_FORBIDDEN];
use LWP::MediaTypes qw[guess_media_type];
use Path::Class     qw[];

$SIG{'PIPE'} = 'IGNORE';

my $base = Path::Class::File->new($0)->parent->parent->absolute;
my $daemon = HTTP::Daemon->new( LocalPort => 8080, ReuseAddr => 1 )
  or die("Can't create daemon: $!");

print "Please contact me at: <URL:", $daemon->url, ">\n";

while ( my $connection = $daemon->accept ) {

    while ( my $request = $connection->get_request ) {

        my $file = $request->url->path =~ m|^/share|
          ? $base->parent->file( $request->url->path )
          : $request->url->path =~ m|^/$| 
              ? $base->file('index.html')
              : $base->file( $request->url->path );

        $file = $file->cleanup->absolute;

        if ( -e $file && $request->method eq 'GET' ) {

            my $stat     = $file->stat;
            my $type     = ( guess_media_type( $file->stringify ) )[0];
            my $response = HTTP::Response->new( 200, 'OK', [ Connection => 'close' ] );

            if ( $request->if_modified_since || 0 == $stat->mtime ) {
                $response->code(304);
                $response->message('Not Modified');
            }
            else {
                $response->content( scalar $file->slurp );
                $response->content_length( $stat->size );
                $response->content_type($type);
                $response->last_modified( $stat->mtime );
            }

            $connection->send_response($response);
        }
        else {
            $connection->send_error(RC_FORBIDDEN);
            $connection->close;
        }
    }
}
