#!/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