Author: stas
Date: Wed Jan  5 21:35:16 2005
New Revision: 124345

URL: http://svn.apache.org/viewcvs?view=rev&rev=124345
Log:
Make PerlSetEnv, PerlPassEnv and %ENV in PerlRequre, PerlModule,
PerlConfigRequire and PerlPostConfigRequire affect each, so a change
in one of these immediately seen in the others. + tests


Added:
   perl/modperl/trunk/t/htdocs/modperl/
   perl/modperl/trunk/t/htdocs/modperl/setupenv2/
   perl/modperl/trunk/t/htdocs/modperl/setupenv2/config_require.pl
   perl/modperl/trunk/t/htdocs/modperl/setupenv2/module.pm   (contents, props 
changed)
   perl/modperl/trunk/t/htdocs/modperl/setupenv2/post_config_require.pl
   perl/modperl/trunk/t/htdocs/modperl/setupenv2/require.pl
   perl/modperl/trunk/t/modperl/setupenv2.t   (contents, props changed)
   perl/modperl/trunk/t/response/TestModperl/setupenv2.pm   (contents, props 
changed)
Modified:
   perl/modperl/trunk/Changes
   perl/modperl/trunk/src/modules/perl/modperl_cmd.c
   perl/modperl/trunk/src/modules/perl/modperl_config.c
   perl/modperl/trunk/src/modules/perl/modperl_env.c
   perl/modperl/trunk/src/modules/perl/modperl_env.h
   perl/modperl/trunk/src/modules/perl/modperl_types.h

Modified: perl/modperl/trunk/Changes
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/Changes?view=diff&rev=124345&p1=perl/modperl/trunk/Changes&r1=124344&p2=perl/modperl/trunk/Changes&r2=124345
==============================================================================
--- perl/modperl/trunk/Changes  (original)
+++ perl/modperl/trunk/Changes  Wed Jan  5 21:35:16 2005
@@ -12,6 +12,13 @@
 
 =item 1.999_21-dev
 
+Make PerlSetEnv, PerlPassEnv and %ENV in PerlRequre, PerlModule,
+PerlConfigRequire and PerlPostConfigRequire affect each, so a change
+in one of these immediately seen in the others. [Pratik <pratiknaik
+gmail.com>, Stas]
+
+
+
 =item 1.999_20 - January 5, 2005
 
 the autogenerated modules (and some implemented in xs/ modules) are

Modified: perl/modperl/trunk/src/modules/perl/modperl_cmd.c
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_cmd.c?view=diff&rev=124345&p1=perl/modperl/trunk/src/modules/perl/modperl_cmd.c&r1=124344&p2=perl/modperl/trunk/src/modules/perl/modperl_cmd.c&r2=124345
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_cmd.c   (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_cmd.c   Wed Jan  5 21:35:16 2005
@@ -133,30 +133,26 @@
     return NULL;
 }
 
+/* this test shows whether the perl for the current s is running
+ * (either base or vhost) */
 static int modperl_vhost_is_running(server_rec *s)
 {
 #ifdef USE_ITHREADS
-    MP_dSCFG(s);
-    int is_vhost = (s != modperl_global_get_server_rec());
-
-    if (is_vhost && scfg->mip) {
-        return TRUE;
-    }
-    else {
-        return FALSE;
+    if (s->is_virtual){
+        MP_dSCFG(s);
+        return scfg->mip ? TRUE : FALSE;
     }
-#else
-    return modperl_is_running();
 #endif
+
+    return modperl_is_running();
+
 }
 
 MP_CMD_SRV_DECLARE(switches)
 {
     server_rec *s = parms->server;
     MP_dSCFG(s);
-    if (s->is_virtual
-        ? modperl_vhost_is_running(s)
-        : modperl_is_running() ) {
+    if (modperl_vhost_is_running(s)) {
         return modperl_cmd_too_late(parms);
     }
     MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
@@ -167,6 +163,7 @@
 MP_CMD_SRV_DECLARE(modules)
 {
     MP_dSCFG(parms->server);
+    modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig;
     MP_PERL_CONTEXT_DECLARE;
 
     MP_CHECK_SERVER_OR_HTACCESS_CONTEXT;
@@ -186,6 +183,10 @@
         if (!modperl_require_module(aTHX_ arg, FALSE)) {
             error = SvPVX(ERRSV);
         }
+        else {
+            modperl_env_sync_srv_env_hash2table(aTHX_ parms->pool, scfg);
+            modperl_env_sync_dir_env_hash2table(aTHX_ parms->pool, dcfg);
+        }
         MP_PERL_CONTEXT_RESTORE;
 
         return error;
@@ -200,6 +201,7 @@
 MP_CMD_SRV_DECLARE(requires)
 {
     MP_dSCFG(parms->server);
+    modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig;
     MP_PERL_CONTEXT_DECLARE;
 
     MP_CHECK_SERVER_OR_HTACCESS_CONTEXT;
@@ -219,6 +221,10 @@
         if (!modperl_require_file(aTHX_ arg, FALSE)) {
             error = SvPVX(ERRSV);
         }
+        else {
+            modperl_env_sync_srv_env_hash2table(aTHX_ parms->pool, scfg);
+            modperl_env_sync_dir_env_hash2table(aTHX_ parms->pool, dcfg);
+        }
         MP_PERL_CONTEXT_RESTORE;
 
         return error;
@@ -244,15 +250,19 @@
 MP_CMD_SRV_DECLARE(post_config_requires)
 {
     apr_pool_t *p = parms->temp_pool;
+    modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig;
     apr_finfo_t finfo;
     MP_dSCFG(parms->server);
 
     if (APR_SUCCESS == apr_stat(&finfo, arg, APR_FINFO_TYPE, p)) {
         if (finfo.filetype != APR_NOFILE) {
             MP_TRACE_d(MP_FUNC, "push PerlPostConfigRequire for %s\n", arg);
-
-            *(const char **)
-                apr_array_push(scfg->PerlPostConfigRequire) = arg;
+            modperl_require_file_t *require = apr_pcalloc(p, sizeof(*require));
+            require->file = arg;
+            require->dcfg = dcfg;
+            
+            *(modperl_require_file_t **)
+                apr_array_push(scfg->PerlPostConfigRequire) = require;
         }
     }
     else {
@@ -331,6 +341,13 @@
     if (!parms->path) {
         /* will be propagated to environ */
         apr_table_setn(scfg->SetEnv, arg1, arg2);
+        /* sync SetEnv => %ENV only for the top-level values */
+        if (modperl_vhost_is_running(parms->server)) {
+            MP_PERL_CONTEXT_DECLARE;
+            MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl);
+            modperl_env_hv_store(aTHX_ arg1, arg2);
+            MP_PERL_CONTEXT_RESTORE;
+        }
     }
 
     apr_table_setn(dcfg->SetEnv, arg1, arg2);
@@ -353,6 +370,12 @@
 
     if (val) {
         apr_table_setn(scfg->PassEnv, arg, apr_pstrdup(parms->pool, val));
+        if (modperl_vhost_is_running(parms->server)) {
+            MP_PERL_CONTEXT_DECLARE;
+            MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl);
+            modperl_env_hv_store(aTHX_ arg, val);
+            MP_PERL_CONTEXT_RESTORE;
+        }
         MP_TRACE_d(MP_FUNC, "arg = %s, val = %s\n", arg, val);
     }
     else {
@@ -368,7 +391,7 @@
     modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig;
     int is_per_dir = parms->path ? 1 : 0;
     modperl_options_t *opts = is_per_dir ? dcfg->flags : scfg->flags;
-    apr_pool_t *p = parms->pool;
+    apr_pool_t *p = parms->temp_pool;
     const char *error;
 
     MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
@@ -473,16 +496,15 @@
 
 MP_CMD_SRV_DECLARE(perldo)
 {
-    apr_pool_t *p = parms->temp_pool;
+    apr_pool_t *p = parms->pool;
     server_rec *s = parms->server;
+    modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig;
     apr_table_t *options;
     modperl_handler_t *handler = NULL;
     const char *pkg_name = NULL;
     ap_directive_t *directive = parms->directive;
-#ifdef USE_ITHREADS
     MP_dSCFG(s);
     MP_PERL_CONTEXT_DECLARE;
-#endif
 
     if (!(arg && *arg)) {
         return NULL;
@@ -541,6 +563,8 @@
         save_scalar(gv); /* local $0 */
         sv_setpv_mg(GvSV(gv), directive->filename);
         eval_pv(arg, FALSE);
+        modperl_env_sync_srv_env_hash2table(aTHX_ p, scfg);
+        modperl_env_sync_dir_env_hash2table(aTHX_ p, dcfg);
         FREETMPS;LEAVE;
     }
 

Modified: perl/modperl/trunk/src/modules/perl/modperl_config.c
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_config.c?view=diff&rev=124345&p1=perl/modperl/trunk/src/modules/perl/modperl_config.c&r1=124344&p2=perl/modperl/trunk/src/modules/perl/modperl_config.c&r2=124345
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_config.c        (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_config.c        Wed Jan  5 
21:35:16 2005
@@ -21,6 +21,8 @@
 
     dcfg->location = dir;
 
+    MP_TRACE_d(MP_FUNC, "dir %s\n", dir);
+    
 #ifdef USE_ITHREADS
     /* defaults to per-server scope */
     dcfg->interp_scope = MP_INTERP_SCOPE_UNDEF;
@@ -107,8 +109,9 @@
         *add  = (modperl_config_dir_t *)addv,
         *mrg  = modperl_config_dir_new(p);
 
-    MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n", 
-               (unsigned long)basev, (unsigned long)addv);
+    MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx\n", 
+               (unsigned long)basev, (unsigned long)addv,
+               (unsigned long)mrg);
 
 #ifdef USE_ITHREADS
     merge_item(interp_scope);
@@ -155,7 +158,8 @@
 
     scfg->PerlModule  = apr_array_make(p, 2, sizeof(char *));
     scfg->PerlRequire = apr_array_make(p, 2, sizeof(char *));
-    scfg->PerlPostConfigRequire = apr_array_make(p, 1, sizeof(char *));
+    scfg->PerlPostConfigRequire =
+        apr_array_make(p, 1, sizeof(modperl_require_file_t *));
 
     scfg->argv = apr_array_make(p, 2, sizeof(char *));
 
@@ -280,8 +284,9 @@
         *add  = (modperl_config_srv_t *)addv,
         *mrg  = modperl_config_srv_new(p);
 
-    MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n", 
-               (unsigned long)basev, (unsigned long)addv);
+    MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx\n", 
+               (unsigned long)basev, (unsigned long)addv,
+               (unsigned long)mrg);
 
     merge_item(modules);
     merge_item(PerlModule);
@@ -443,26 +448,28 @@
                                                modperl_config_srv_t *scfg,
                                                apr_pool_t *p)
 {
-    char **requires;
+    modperl_require_file_t **requires;
     int i;
     MP_PERL_CONTEXT_DECLARE;
 
-    requires = (char **)scfg->PerlPostConfigRequire->elts;
+    requires = (modperl_require_file_t **)scfg->PerlPostConfigRequire->elts;
     for (i = 0; i < scfg->PerlPostConfigRequire->nelts; i++){
         int retval;
 
         MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl);
-        retval = modperl_require_file(aTHX_ requires[i], TRUE);
+        retval = modperl_require_file(aTHX_ requires[i]->file, TRUE);
+        modperl_env_sync_srv_env_hash2table(aTHX_ p, scfg);
+        modperl_env_sync_dir_env_hash2table(aTHX_ p, requires[i]->dcfg);
         MP_PERL_CONTEXT_RESTORE;
 
         if (retval) {
             MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s\n",
-                       requires[i], modperl_server_desc(s, p));
+                       requires[i]->file, modperl_server_desc(s, p));
         }
         else {
             ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
                          "Can't load Perl file: %s for server %s, exiting...",
-                         requires[i], modperl_server_desc(s, p));
+                         requires[i]->file, modperl_server_desc(s, p));
             
             return FALSE;
         }

Modified: perl/modperl/trunk/src/modules/perl/modperl_env.c
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_env.c?view=diff&rev=124345&p1=perl/modperl/trunk/src/modules/perl/modperl_env.c&r1=124344&p2=perl/modperl/trunk/src/modules/perl/modperl_env.c&r2=124345
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_env.c   (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_env.c   Wed Jan  5 21:35:16 2005
@@ -28,23 +28,27 @@
 #endif
 }
 
-static MP_INLINE
-void modperl_env_hv_store(pTHX_ HV *hv, apr_table_entry_t *elt)
-{
-    I32 klen = strlen(elt->key);
-    SV **svp = hv_fetch(hv, elt->key, klen, FALSE);
-
-    if (svp) {
-        sv_setpv(*svp, elt->val);
-    }
-    else {
-        SV *sv = newSVpv(elt->val, 0);
-        hv_store(hv, elt->key, klen, sv, FALSE);
-        modperl_envelem_tie(sv, elt->key, klen);
-        svp = &sv;
-    }
+#define MP_ENV_HV_STORE(hv, key, val) STMT_START {              \
+        I32 klen = strlen(key);                                 \
+        SV **svp = hv_fetch(hv, key, klen, FALSE);              \
+                                                                \
+        if (svp) {                                              \
+            sv_setpv(*svp, val);                                \
+        }                                                       \
+        else {                                                  \
+            SV *sv = newSVpv(val, 0);                           \
+            hv_store(hv, key, klen, sv, FALSE);                 \
+            modperl_envelem_tie(sv, key, klen);                 \
+            svp = &sv;                                          \
+        }                                                       \
+        MP_TRACE_e(MP_FUNC, "$ENV{%s} = \"%s\";", key, val);    \
+                                                                \
+        SvTAINTED_on(*svp);                                     \
+    } STMT_END
 
-    SvTAINTED_on(*svp);
+void modperl_env_hv_store(pTHX_ const char *key, const char *val)
+{
+    MP_ENV_HV_STORE(ENVHV, key, val);
 }
 
 static MP_INLINE
@@ -98,6 +102,9 @@
     modperl_env_tie(mg_flags);
 }
 
+#define MP_ENV_HV_STORE_TABLE_ENTRY(hv, elt)    \
+    MP_ENV_HV_STORE(hv, elt.key, elt.val);
+
 static void modperl_env_table_populate(pTHX_ apr_table_t *table)
 {
     HV *hv = ENVHV;
@@ -115,9 +122,7 @@
         if (!elts[i].key || !elts[i].val) {
             continue;
         }
-        modperl_env_hv_store(aTHX_ hv, &elts[i]);
-
-        MP_TRACE_e(MP_FUNC, "$ENV{%s} = \"%s\";", elts[i].key, elts[i].val);
+        MP_ENV_HV_STORE_TABLE_ENTRY(hv, elts[i]);
     }    
 
     modperl_env_tie(mg_flags);
@@ -141,11 +146,58 @@
             continue;
         }
         modperl_env_hv_delete(aTHX_ hv, elts[i].key);
-
         MP_TRACE_e(MP_FUNC, "delete $ENV{%s};", elts[i].key);
-    }    
+    }
 
     modperl_env_tie(mg_flags);
+}
+
+/* see the comment in modperl_env_sync_env_hash2table */
+static void modperl_env_sync_table(pTHX_ apr_table_t *table)
+{
+    int i;
+    const apr_array_header_t *array;
+    apr_table_entry_t *elts;
+    HV *hv = ENVHV;
+    SV **svp;
+    
+    array = apr_table_elts(table);
+    elts  = (apr_table_entry_t *)array->elts;
+    
+    for (i = 0; i < array->nelts; i++) {
+        if (!elts[i].key) {
+            continue;
+        }
+        svp = hv_fetch(hv, elts[i].key, strlen(elts[i].key), FALSE);
+        if (svp) {
+            apr_table_set(table, elts[i].key, SvPV_nolen(*svp));
+            MP_TRACE_e(MP_FUNC, "(Set|Pass)Env '%s' '%s'", elts[i].key,
+                       SvPV_nolen(*svp));
+        }
+    }    
+    TAINT_NOT; /* SvPV_* causes the taint issue */
+}
+
+/* Make per-server PerlSetEnv and PerlPassEnv in sync with %ENV at
+ * config time (if perl is running), by copying %ENV values to the
+ * PerlSetEnv and PerlPassEnv tables (only for keys which are already
+ * in those tables)
+ */
+void modperl_env_sync_srv_env_hash2table(pTHX_ apr_pool_t *p,
+                                         modperl_config_srv_t *scfg)
+{
+    MP_TRACE_d(MP_FUNC, "******* scfg==0x%lx, scfg->SetEnv==0x%lx\n",
+               (unsigned long)scfg, (unsigned long)scfg->SetEnv);
+    modperl_env_sync_table(aTHX_ scfg->SetEnv);
+    modperl_env_sync_table(aTHX_ scfg->PassEnv);
+}
+
+void modperl_env_sync_dir_env_hash2table(pTHX_ apr_pool_t *p,
+                                         modperl_config_dir_t *dcfg)
+{
+    MP_TRACE_d(MP_FUNC, "******* dcfg==0x%lx, dcfg->SetEnv==0x%lx\n",
+               (unsigned long)dcfg, (unsigned long)dcfg->SetEnv);
+    modperl_env_sync_table(aTHX_ dcfg->SetEnv);
 }
 
 /* list of environment variables to pass by default */

Modified: perl/modperl/trunk/src/modules/perl/modperl_env.h
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_env.h?view=diff&rev=124345&p1=perl/modperl/trunk/src/modules/perl/modperl_env.h&r1=124344&p2=perl/modperl/trunk/src/modules/perl/modperl_env.h&r2=124345
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_env.h   (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_env.h   Wed Jan  5 21:35:16 2005
@@ -33,6 +33,14 @@
 
 void modperl_env_clear(pTHX);
 
+void modperl_env_hv_store(pTHX_ const char *key, const char *val);
+
+void modperl_env_sync_srv_env_hash2table(pTHX_ apr_pool_t *p,
+                                         modperl_config_srv_t *scfg);
+
+void modperl_env_sync_dir_env_hash2table(pTHX_ apr_pool_t *p,
+                                         modperl_config_dir_t *dcfg);
+
 void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s);
 
 void modperl_env_configure_request_srv(pTHX_ request_rec *r);

Modified: perl/modperl/trunk/src/modules/perl/modperl_types.h
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_types.h?view=diff&rev=124345&p1=perl/modperl/trunk/src/modules/perl/modperl_types.h&r1=124344&p2=perl/modperl/trunk/src/modules/perl/modperl_types.h&r2=124345
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_types.h (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_types.h Wed Jan  5 21:35:16 2005
@@ -165,6 +165,11 @@
 #endif
 } modperl_config_dir_t;
 
+typedef struct {
+    const char *file;
+    modperl_config_dir_t *dcfg;
+} modperl_require_file_t;
+
 typedef struct modperl_mgv_t modperl_mgv_t;
 
 struct modperl_mgv_t {

Added: perl/modperl/trunk/t/htdocs/modperl/setupenv2/config_require.pl
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/htdocs/modperl/setupenv2/config_require.pl?view=auto&rev=124345
==============================================================================
--- (empty file)
+++ perl/modperl/trunk/t/htdocs/modperl/setupenv2/config_require.pl     Wed Jan 
 5 21:35:16 2005
@@ -0,0 +1,5 @@
+TestModperl::setupenv2::register_mixed();
+TestModperl::setupenv2::register_perl();
+$ENV{EnvChangeMixedTest} = "config_require";
+$ENV{EnvChangePerlTest}  = "config_require";
+1;

Added: perl/modperl/trunk/t/htdocs/modperl/setupenv2/module.pm
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/htdocs/modperl/setupenv2/module.pm?view=auto&rev=124345
==============================================================================
--- (empty file)
+++ perl/modperl/trunk/t/htdocs/modperl/setupenv2/module.pm     Wed Jan  5 
21:35:16 2005
@@ -0,0 +1,6 @@
+package htdocs::modperl::setupenv2::module;
+TestModperl::setupenv2::register_mixed();
+TestModperl::setupenv2::register_perl();
+$ENV{EnvChangeMixedTest} = "perlmodule";
+$ENV{EnvChangePerlTest}  = "perlmodule";
+1;

Added: perl/modperl/trunk/t/htdocs/modperl/setupenv2/post_config_require.pl
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/htdocs/modperl/setupenv2/post_config_require.pl?view=auto&rev=124345
==============================================================================
--- (empty file)
+++ perl/modperl/trunk/t/htdocs/modperl/setupenv2/post_config_require.pl        
Wed Jan  5 21:35:16 2005
@@ -0,0 +1,5 @@
+TestModperl::setupenv2::register_mixed();
+TestModperl::setupenv2::register_perl();
+$ENV{EnvChangeMixedTest} = "post_config_require";
+$ENV{EnvChangePerlTest}  = "post_config_require";
+1;

Added: perl/modperl/trunk/t/htdocs/modperl/setupenv2/require.pl
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/htdocs/modperl/setupenv2/require.pl?view=auto&rev=124345
==============================================================================
--- (empty file)
+++ perl/modperl/trunk/t/htdocs/modperl/setupenv2/require.pl    Wed Jan  5 
21:35:16 2005
@@ -0,0 +1,5 @@
+TestModperl::setupenv2::register_mixed();
+TestModperl::setupenv2::register_perl();
+$ENV{EnvChangeMixedTest} = "require";
+$ENV{EnvChangePerlTest}  = "require";
+1;

Added: perl/modperl/trunk/t/modperl/setupenv2.t
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/modperl/setupenv2.t?view=auto&rev=124345
==============================================================================
--- (empty file)
+++ perl/modperl/trunk/t/modperl/setupenv2.t    Wed Jan  5 21:35:16 2005
@@ -0,0 +1,35 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestUtil;
+use Apache::TestRequest;
+
+my $location = "/TestModperl__setupenv2";
+
+my %expected = (
+    mixed => [qw(loadmodule conf1 <perl> conf2 require conf3
+                config_require conf4 perlmodule conf5 conf5
+                conf6 conf7 conf8 post_config_require)],
+    perl  => [qw(loadmodule <perl> require config_require
+                perlmodule post_config_require)],
+);
+
+plan tests => 2 + scalar(@{ $expected{mixed} }) + scalar(@{ $expected{perl} });
+
+while (my($k, $v) = each %expected) {
+    my @expected = @$v;
+    my $elements = scalar @expected;
+    my $received = GET_BODY "$location?$k";
+    t_debug "$k: $received";
+    my @received = split / /, $received;
+
+    ok t_cmp $received[$_], $expected[$_] for 0..$#expected;
+
+    ok t_cmp scalar(@received), scalar(@expected), "elements";
+    if (@received > @expected) {
+        t_debug "unexpected elements: " .
+            join " ", @received[$elements..$#received];
+    }
+}
+

Added: perl/modperl/trunk/t/response/TestModperl/setupenv2.pm
Url: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/response/TestModperl/setupenv2.pm?view=auto&rev=124345
==============================================================================
--- (empty file)
+++ perl/modperl/trunk/t/response/TestModperl/setupenv2.pm      Wed Jan  5 
21:35:16 2005
@@ -0,0 +1,134 @@
+package TestModperl::setupenv2;
+
+# Test the mixing of PerlSetEnv in httpd.conf and %ENV of the same
+# key in PerlRequire, PerlConfigRequire, PerlPostConfigRequire and
+# <Perl> sections
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Const -compile => qw(OK OR_ALL NO_ARGS);
+
+use Apache::CmdParms ();
+use Apache::Module ();
+use Apache::RequestIO ();
+use Apache::RequestRec ();
+
+my @directives = (
+    {
+     name         => 'MyEnvRegister',
+     func         => __PACKAGE__ . '::MyEnvRegister',
+     req_override => Apache::OR_ALL,
+     args_how     => Apache::NO_ARGS,
+     errmsg       => 'cannot fail :)',
+    },
+);
+
+Apache::Module::add(__PACKAGE__, [EMAIL PROTECTED]);
+
+# testing PerlLoadModule
+$ENV{EnvChangeMixedTest} = 'loadmodule';
+$ENV{EnvChangePerlTest}  = 'loadmodule';
+
+sub MyEnvRegister {
+    register_mixed();
+}
+
+sub register_mixed {
+    push @TestModperl::setupenv2::EnvChangeMixedTest,
+        $ENV{EnvChangeMixedTest} || 'notset';
+}
+
+sub register_perl {
+    push @TestModperl::setupenv2::EnvChangePerlTest,
+        $ENV{EnvChangePerlTest}  || 'notset';
+}
+
+sub get_config {
+    my($self, $s) = (shift, shift);
+    Apache::Module::get_config($self, $s, @_);
+}
+
+sub handler {
+    my($r) = @_;
+
+    my $args = $r->args || '';
+
+    $r->content_type('text/plain');
+
+    if ($args eq 'mixed') {
+        my @vals = (@TestModperl::setupenv2::EnvChangeMixedTest,
+            $ENV{EnvChangeMixedTest}); # what's the latest env value
+        $r->print(join " ", @vals);
+    }
+    elsif ($args eq 'perl') {
+        my @vals = (@TestModperl::setupenv2::EnvChangePerlTest,
+            $ENV{EnvChangePerlTest}); # what's the latest env value
+        $r->print(join " ", @vals);
+    }
+    else {
+        die "no such case";
+    }
+
+    return Apache::OK;
+}
+
+1;
+__END__
+
+# APACHE_TEST_CONFIG_ORDER 950
+
+<NoAutoConfig>
+PerlLoadModule TestModperl::setupenv2
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf1"
+
+<Perl>
+TestModperl::setupenv2::register_mixed();
+TestModperl::setupenv2::register_perl();
+$ENV{EnvChangeMixedTest} = "<perl>";
+$ENV{EnvChangePerlTest}  = "<perl>";
+</Perl>
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf2"
+
+PerlRequire           "@documentroot@/modperl/setupenv2/require.pl"
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf3"
+
+PerlConfigRequire     "@documentroot@/modperl/setupenv2/config_require.pl"
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf4"
+
+PerlModule htdocs::modperl::setupenv2::module
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf5"
+MyEnvRegister
+
+PerlPostConfigRequire "@documentroot@/modperl/setupenv2/post_config_require.pl"
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf6"
+MyEnvRegister
+
+PerlSetEnv EnvChangeMixedTest "conf7"
+MyEnvRegister
+
+<Location /TestModperl__setupenv2>
+    SetHandler modperl
+    PerlResponseHandler TestModperl::setupenv2
+</Location>
+
+PerlSetEnv EnvChangeMixedTest "conf8"
+
+# Since PerlPostConfigRequire runs in the post-config phase it will
+# see 'conf8'. And when it sets that value to 'post_config_require' at
+# request time $ENV{EnvChangeMixedTest} will see the value set by
+# PerlPostConfigRequire.
+
+</NoAutoConfig>

Reply via email to