Author: stas Date: Tue May 10 19:17:16 2005 New Revision: 169560 URL: http://svn.apache.org/viewcvs?rev=169560&view=rev Log: introduce ModPerl::RegistryPrefork and ModPerl::PerlRunPrefork, which behave the same as ModPerl::Registry and ModPerl::PerlRun, respectively, but chdir to the script's directory like mod_cgi does. These two new handlers will refuse to load under threaded MPMs where chdir can't be used as it will affect all running threads + tests
Added: perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm (with props) perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm (with props) perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/prefork.pl (with props) perl/modperl/trunk/ModPerl-Registry/t/prefork.t (with props) Modified: perl/modperl/trunk/Changes perl/modperl/trunk/ModPerl-Registry/t/conf/extra.conf.in Modified: perl/modperl/trunk/Changes URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/Changes?rev=169560&r1=169559&r2=169560&view=diff ============================================================================== --- perl/modperl/trunk/Changes (original) +++ perl/modperl/trunk/Changes Tue May 10 19:17:16 2005 @@ -12,6 +12,12 @@ =item 1.999_24-dev +introduce ModPerl::RegistryPrefork and ModPerl::PerlRunPrefork, which +behave the same as ModPerl::Registry and ModPerl::PerlRun, +respectively, but chdir to the script's directory like mod_cgi +does. These two new handlers will refuse to load under threaded MPMs +where chdir can't be used as it will affect all running threads [Stas] + ModPerl::RegistryCooker::chdir_file_normal() now chdirs to the current script's directory or the specified directory as an argument, as it was planned in first place. Therefore switch ModPerl::Registry and Added: perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm?rev=169560&view=auto ============================================================================== --- perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm (added) +++ perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm Tue May 10 19:17:16 2005 @@ -0,0 +1,24 @@ +package ModPerl::PerlRunPrefork; + +use strict; +use warnings FATAL => 'all'; + +our $VERSION = '0.01'; + +use base qw(ModPerl::PerlRun); + +use Apache2::MPM (); + +die "This package can't be used under threaded MPMs" + if Apache2::MPM->is_threaded; + +sub handler : method { + my $class = (@_ >= 2) ? shift : __PACKAGE__; + my $r = shift; + return $class->new($r)->default_handler(); +} + +*chdir_file = \&ModPerl::RegistryCooker::chdir_file_normal; + +1; +__END__ Propchange: perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm ------------------------------------------------------------------------------ svn:eol-style = native Added: perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm?rev=169560&view=auto ============================================================================== --- perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm (added) +++ perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm Tue May 10 19:17:16 2005 @@ -0,0 +1,24 @@ +package ModPerl::RegistryPrefork; + +use strict; +use warnings FATAL => 'all'; + +our $VERSION = '0.01'; + +use base qw(ModPerl::Registry); + +use Apache2::MPM (); + +die "This package can't be used under threaded MPMs" + if Apache2::MPM->is_threaded; + +sub handler : method { + my $class = (@_ >= 2) ? shift : __PACKAGE__; + my $r = shift; + return $class->new($r)->default_handler(); +} + +*chdir_file = \&ModPerl::RegistryCooker::chdir_file_normal; + +1; +__END__ Propchange: perl/modperl/trunk/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm ------------------------------------------------------------------------------ svn:eol-style = native Added: perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/prefork.pl URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/prefork.pl?rev=169560&view=auto ============================================================================== --- perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/prefork.pl (added) +++ perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/prefork.pl Tue May 10 19:17:16 2005 @@ -0,0 +1,19 @@ +#!perl -w + +# test that prefork runs from the directory the script lives in + +# All Modperl::*Prefork modules must chdir into the current dir, so we +# should be able to read ourselves via a relative path + +print "Content-type: text/plain\n\n"; + +my $script = "prefork.pl"; +if (open my $fh, $script) { + print "ok $script"; +} +else { + print "prefork didn't chdir into the scripts directory?"; + print " The error was: $!"; +} + + Propchange: perl/modperl/trunk/ModPerl-Registry/t/cgi-bin/prefork.pl ------------------------------------------------------------------------------ svn:executable = * Modified: perl/modperl/trunk/ModPerl-Registry/t/conf/extra.conf.in URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/t/conf/extra.conf.in?rev=169560&r1=169559&r2=169560&view=diff ============================================================================== --- perl/modperl/trunk/ModPerl-Registry/t/conf/extra.conf.in (original) +++ perl/modperl/trunk/ModPerl-Registry/t/conf/extra.conf.in Tue May 10 19:17:16 2005 @@ -38,7 +38,9 @@ Alias /registry/ @ServerRoot@/cgi-bin/ Alias /registry_bb/ @ServerRoot@/cgi-bin/ Alias /registry_oo_conf/ @ServerRoot@/cgi-bin/ +Alias /registry_prefork/ @ServerRoot@/cgi-bin/ Alias /perlrun/ @ServerRoot@/cgi-bin/ +Alias /perlrun_prefork/ @ServerRoot@/cgi-bin/ Alias /nph/ @ServerRoot@/cgi-bin/ Alias /registry_modperl_handler/ @ServerRoot@/cgi-bin/ @@ -79,6 +81,24 @@ SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::Registry +</Location> + +# don't preload ModPerl::RegistryPrefork as it won't load under +# threaded MPMs +<Location /registry_prefork> + SetHandler perl-script + Options +ExecCGI + PerlResponseHandler ModPerl::RegistryPrefork + PerlOptions +ParseHeaders +</Location> + +# don't preload ModPerl::PerlRunPrefork as it won't load under +# threaded MPMs +<Location /perlrun_prefork> + SetHandler perl-script + Options +ExecCGI + PerlResponseHandler ModPerl::PerlRunPrefork + PerlOptions +ParseHeaders </Location> PerlModule ModPerl::PerlRun Added: perl/modperl/trunk/ModPerl-Registry/t/prefork.t URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/ModPerl-Registry/t/prefork.t?rev=169560&view=auto ============================================================================== --- perl/modperl/trunk/ModPerl-Registry/t/prefork.t (added) +++ perl/modperl/trunk/ModPerl-Registry/t/prefork.t Tue May 10 19:17:16 2005 @@ -0,0 +1,47 @@ +use strict; +use warnings FATAL => 'all'; + +use Apache::Test; +use Apache::TestUtil; +use Apache::TestRequest; +use Apache::TestConfig (); + +use Apache2::Build (); + +my $mpm_is_threaded = Apache2::Build->build_config->mpm_is_threaded(); + +my %modules = ( + registry => 'ModPerl::Registry', + perlrun => 'ModPerl::PerlRun', + registry_prefork => 'ModPerl::RegistryPrefork', + perlrun_prefork => 'ModPerl::PerlRunPrefork', +); + +my @aliases = sort keys %modules; + +plan tests => [EMAIL PROTECTED], need { + "can't run under threaded MPMs" => !$mpm_is_threaded }; + +my $script = "prefork.pl"; + +# very basic compilation/response test +for my $alias (qw(registry_prefork perlrun_prefork)) { + my $url = "/$alias/$script"; + + #t_debug "$url"; + ok t_cmp GET_BODY($url), "ok $script", "$modules{$alias} test"; +} + +# the order is important, we also want to check that prefork specific +# modules didn't affect the cwd of other modules + +# the normal handlers should not find the script in the cwd, as they +# don't chdir to its directory before running the script +for my $alias (qw(registry perlrun)) { + my $url = "/$alias/$script"; + + #t_debug "$url"; + ok t_cmp GET_BODY($url), + qr/prefork didn't chdir into the scripts directory/, + "$modules{$alias} test"; +} Propchange: perl/modperl/trunk/ModPerl-Registry/t/prefork.t ------------------------------------------------------------------------------ svn:eol-style = native