You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by ge...@apache.org on 2004/01/30 19:20:10 UTC
cvs commit: modperl-2.0/xs/Apache/RequestRec Apache__RequestRec.h
geoff 2004/01/30 10:20:10
Modified: t/response/TestModperl subenv.pm
xs/Apache/RequestRec Apache__RequestRec.h
Log:
fix calling $r->subprocess_env() in a void context so that it only
populates %ENV if also called with no arguments. also, make sure it
can be called more than once and still populate %ENV.
Revision Changes Path
1.4 +61 -13 modperl-2.0/t/response/TestModperl/subenv.pm
Index: subenv.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestModperl/subenv.pm,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- subenv.pm 29 Jan 2004 23:34:00 -0000 1.3
+++ subenv.pm 30 Jan 2004 18:20:10 -0000 1.4
@@ -11,35 +11,83 @@
use Apache::Const -compile => 'OK';
sub handler {
+
my $r = shift;
- plan $r, tests => 19;
+ plan $r, tests => 31;
+
+ # subprocess_env in void context with arguments does
+ # nothing to %ENV
+ {
+ my $env = $r->subprocess_env;
+
+ my $key = 'ONCE';
+
+ ok_false($r, $key);
- my $env = $r->subprocess_env;
- ok $env;
+ $r->subprocess_env($key => 1); # void context but with args
+
+ ok_true($r, $key);
+
+ ok ! $ENV{$key}; # %ENV not populated yet
+ }
- # subprocess_env in void context populates the same as +SetEnv
+ # subprocess_env in void context with no arguments
+ # populates the same as +SetEnv
{
+ my $env = $r->subprocess_env;
+
my $key = 'REMOTE_ADDR';
- ok_false($r, $key);
- $r->subprocess_env;
+
+ ok_false($r, $key); # still not not there yet
+
+ ok ! $ENV{$key}; # %ENV not populated yet
+
+ $r->subprocess_env; # void context with no arguments
+
ok_true($r, $key);
- ok $ENV{$key}; # mod_cgi emulation
+
+ ok $ENV{$key}; # mod_cgi emulation
}
+ # handlers can use a void context more than once to force
+ # population of %ENV with new table entries
{
+ my $env = $r->subprocess_env;
+
+ my $key = 'AGAIN';
+
+ $env->set($key => 1); # new table entry
+
+ ok_true($r, $key);
+
+ ok ! $ENV{$key}; # shouldn't affect %ENV yet
+
+ $r->subprocess_env; # now called in in void context twice
+
+ ok $ENV{$key}; # so %ENV is populated with new entry
+ }
+
+ {
+ my $env = $r->subprocess_env; # table may have been overlayed
+
my $key = 'FOO';
- $env = $r->subprocess_env; #table may have been overlayed
- $env->set($key => 1);
+
+ $env->set($key => 1); # direct call to set()
+
ok_true($r, $key);
- ok ! $ENV{$key}; # shouldn't affect %ENV
+
+ ok ! $ENV{$key}; # shouldn't affect %ENV
$r->subprocess_env($key => undef);
- ok_false($r, $key);
+
+ ok_false($r, $key); # removed
$r->subprocess_env($key => 1);
- ok_true($r, $key);
- ok ! $ENV{$key}; # shouldn't affect %ENV
+
+ ok_true($r, $key); # reset
+
+ ok ! $ENV{$key}; # still shouldn't affect %ENV
}
Apache::OK;
1.9 +8 -1 modperl-2.0/xs/Apache/RequestRec/Apache__RequestRec.h
Index: Apache__RequestRec.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/Apache/RequestRec/Apache__RequestRec.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Apache__RequestRec.h 14 Jan 2004 21:27:41 -0000 1.8
+++ Apache__RequestRec.h 30 Jan 2004 18:20:10 -0000 1.9
@@ -46,8 +46,15 @@
SV *mpxs_Apache__RequestRec_subprocess_env(pTHX_ request_rec *r,
char *key, SV *val)
{
- if (GIMME_V == G_VOID) {
+ /* if called in a void context with no arguments, just
+ * populate %ENV and stop. resetting SetupEnv off makes
+ * calling in a void context more than once meaningful.
+ */
+ if (key == NULL && GIMME_V == G_VOID) {
+ MP_dRCFG;
+ MpReqSETUP_ENV_Off(rcfg);
modperl_env_request_populate(aTHX_ r);
+ return &PL_sv_undef;
}
return modperl_table_get_set(aTHX_ r->subprocess_env,