stas 01/11/12 20:33:06 Modified: ModPerl-Registry/t/conf extra.conf.in Added: ModPerl-Registry/t/conf modperl_extra_startup.pl ModPerl-Registry/lib/ModPerl RegistryLoader.pm Log: - implement RegistryLoader and test it in the startup file Revision Changes Path 1.3 +3 -0 modperl-2.0/ModPerl-Registry/t/conf/extra.conf.in Index: extra.conf.in =================================================================== RCS file: /home/cvs/modperl-2.0/ModPerl-Registry/t/conf/extra.conf.in,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- extra.conf.in 2001/10/19 06:46:25 1.2 +++ extra.conf.in 2001/11/13 04:33:06 1.3 @@ -3,6 +3,9 @@ # make sure that we test under Taint mode PerlSwitches -T +# run on startup +PerlRequire @ServerRoot@/conf/modperl_extra_startup.pl + PerlSwitches -Mlib=@ServerRoot@/../lib PerlSwitches -Mlib=@ServerRoot@/../../Apache-Test/lib PerlSwitches -Mlib=@ServerRoot@/../../lib 1.1 modperl-2.0/ModPerl-Registry/t/conf/modperl_extra_startup.pl Index: modperl_extra_startup.pl =================================================================== # use strict; use warnings; # test the scripts pre-loading by explicitly specifying uri => filename use ModPerl::RegistryLoader (); my $rl = ModPerl::RegistryLoader->new(package => "ModPerl::Registry"); my $base_dir = Apache::server_root_relative("cgi-bin"); my $base_uri = "/cgi-bin"; for my $file (qw(basic.pl env.pl)) { my $file_path = "$base_dir/$file"; my $info_path = "$base_uri/$file"; $rl->handler($info_path, $file_path); } { # test the scripts pre-loading by using trans sub use ModPerl::RegistryLoader (); use DirHandle (); use strict; my $dir = Apache::server_root_relative("cgi-bin"); sub trans { my $uri = shift; $uri =~ s|^/registry_bb/|cgi-bin/|; return Apache::server_root_relative($uri); } my $rl = ModPerl::RegistryLoader->new(package => "ModPerl::RegistryBB", trans => \&trans); my $dh = DirHandle->new($dir) or die $!; for my $file ($dh->read) { next unless $file =~ /\.pl$/; $rl->handler("/registry_bb/$file"); } } 1; 1.1 modperl-2.0/ModPerl-Registry/lib/ModPerl/RegistryLoader.pm Index: RegistryLoader.pm =================================================================== package ModPerl::RegistryLoader; use Apache::Const -compile => qw(OPT_EXECCGI); use Carp; our @ISA = (); sub new { my $class = shift; my $self = bless {@_} => ref($class)||$class; $self->load_package($self->{package}); return $self; } sub handler { my($self, $uri, $filename) = @_; # set the inheritance rules at run time @ISA = $self->{package}; unless (defined $uri) { $self->warn("uri is a required argument"); return; } if (defined $filename) { unless (-e $filename) { $self->warn("Cannot find: $filename"); return; } } else { # try to translate URI->filename if (my $func = $self->{trans}) { no strict 'refs'; $filename = $func->($uri); unless (-e $filename) { $self->warn("Cannot find a translated from uri: $filename"); return; } } else { # try to guess (my $guess = $uri) =~ s|^/||; $filename = Apache::server_root_relative($guess); $self->warn("Trying to guess filename based on uri"); unless (-e $filename) { $self->warn("Cannot find guessed file: $filename", "provide \$filename or 'trans' sub"); return; } } } if ($self->{debug}) { $self->warn("*** uri=$uri, filename=$filename"); } my $r = bless { uri => $uri, filename => $filename, } => ref($self) || $self; $r->SUPER::handler; } sub filename { shift->{filename} } sub finfo { shift->{filename} } sub uri { shift->{uri} } sub path_info {} sub allow_options { Apache::OPT_EXECCGI } #will be checked again at run-time sub log_error { shift; die @_ if $@; warn @_; } *log_reason = \&log_error; sub run {} # don't run the script sub server { shift } # override Apache class methods called by Modperl::Registry*. normally # only available at request-time via blessed request_rec pointer sub slurp_filename { my $r = shift; my $filename = $r->filename; open my $fh, $filename; local $/; my $code = <$fh>; return \$code; } sub load_package { my($self, $package) = @_; croak "package to load wasn't specified" unless defined $package; $package =~ s|::|/|g; $package .= ".pm"; require $package; }; sub warn { my $self = shift; Apache::warn(__PACKAGE__ . ": @_\n"); } 1; __END__