http://paperlined.org/dev/src/pl/application_http-index-format.pl
#!/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
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
The requested URL $requested was not found on this server.<P>
<HR>
$ENV{SERVER_SIGNATURE}
</BODY></HTML>
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; <FIN>};
close FIN;
if ($contents =~ /\(([^)<>]*)\)/m) {
return "==== $1 ====";
}
}
}
return undef;
}
Generated by GNU enscript 1.6.4.