package Apache::BrowseSee; use strict; use Apache::Constants qw(:common); use File::Spec::Functions qw(catdir canonpath curdir updir); use File::Basename 'dirname'; sub new { bless {}, shift;} sub handler ($$) { my($self, $r) = @_; $self = $self->new unless ref $self; $self->{r} = $r; $self->{dir} = $r->path_info || '/'; $self->{dirs} = {}; $self->{files} = {}; eval { $self->fetch() }; return NOT_FOUND if $@; $self->head; $self->render; $self->tail; return OK; } sub head { my $self = shift; $self->{r}->send_http_header("text/html"); print "Dir: $self->{dir}"; } sub tail { my $self = shift; print ""; } sub fetch { my $self = shift; my $doc_root = Apache->document_root; my $base_dir = canonpath( catdir($doc_root, $self->{dir})); my $base_entry = $self->{dir} eq '/' ? '' : $self->{dir}; my $dh = Apache::gensym(); opendir $dh, $base_dir or die "Cannot open $base_dir: $!"; for (readdir $dh) { next if $_ eq curdir(); my $full_dir = catdir $base_dir, $_; my $entry = "$base_entry/$_"; if (-d $full_dir) { if ($_ eq updir()) { $entry = dirname $self->{dir}; next if catdir($base_dir, $entry) eq $doc_root; } $self->{dirs}{$_} = $entry; } else { $self->{files}{$_} = $entry; } } closedir $dh; } sub render { my $self = shift; print "Current Directory: $self->{dir}
"; my $location = $self->{r}->location; print qq{$_
} for sort keys %{ $self->{dirs} || {} }; print qq{$_
} for sort keys %{ $self->{files} || {} }; } 1; __END__