#!/usr/bin/perl use strict; use warnings; use CGI::Carp qw(fatalsToBrowser); BEGIN {$ENV{HOME} ||= (getpwuid($<))[7]} # in case $HOME isn't set BEGIN {require "$ENV{HOME}/.cgiEnvVars.pm"} use CGI; use HTTP::Date; use Data::Dumper; use CGI::Util; my $external_directory = $ENV{PATH_INFO}; #print "Content-type: text/plain\n\n$external_directory\nFIN\n"; exit; defined($external_directory) or doesnt_exist(""); my $internal_directory = get_internal_directory_from_external($external_directory); -d $internal_directory or doesnt_exist($external_directory); print "Content-Type: application/http-index-format; charset=utf-8\n\n"; my $requested_url = "http://" . $ENV{SERVER_NAME} . $external_directory; print "300: $requested_url\n"; print "200: Filename Content-Length File-type Last-Modified\n"; my $directory_description = get_directory_description($internal_directory); if ($directory_description) { $directory_description =~ s/^/101: /; $directory_description =~ s/[\n\r]$//s; print "$directory_description\n"; } opendir DIR, $internal_directory or die "Unable to open directory '$internal_directory': $!\n\t"; my @entries = readdir(DIR); closedir DIR; # default sort order: most-recently-modified first my %age = map {$_ => -M "$internal_directory/$_"} @entries; @entries = sort {$age{$a} <=> $age{$b}} @entries; foreach my $filename (@entries) { next if ($filename =~ /^\./); next if ($filename eq 'HEADER.html'); my $fullpath = "$internal_directory/$filename"; printf "201: \"%s\" %d %s %s\n", $filename, -s $fullpath, -d $fullpath ? "DIRECTORY" : "FILE", CGI::Util::escape( HTTP::Date::time2str( # RFC 1123 date (stat $fullpath)[9] ) ); } exit; sub doesnt_exist { my $requested = shift; print <<"EOF"; Status: 404 Content-type: text/html 404 Not Found

Not Found

The requested URL $requested was not found on this server.


$ENV{SERVER_SIGNATURE} EOF exit; } # =================== per-website customizations ========================== sub get_internal_directory_from_external { my $external_dir = shift; return "/home/interiot/public_html/" . $external_dir; } sub get_directory_description { my $dir = shift; if (-f "$dir/HEADER.html") { if (open FIN, "$dir/HEADER.html") { my $contents = do {local $/=undef; }; close FIN; if ($contents =~ /\(([^)<>]*)\)/m) { return "==== $1 ===="; } } } return undef; }