Author: rjung
Date: Mon Feb 19 04:01:40 2007
New Revision: 509173

URL: http://svn.apache.org/viewvc?view=rev&rev=509173
Log:
Change semantics of empty defaults for JkEnvVar variables.

Modified:
    tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
    tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
    tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml
    tomcat/connectors/trunk/jk/xdocs/reference/apache.xml
    tomcat/connectors/trunk/jk/xdocs/webserver_howto/apache.xml

Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?view=diff&rev=509173&r1=509172&r2=509173
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Mon Feb 19 04:01:40 
2007
@@ -102,6 +102,16 @@
 #endif
 
 /*
+ * Environment variable forward object
+ */
+typedef struct
+{
+    int has_default;
+    char *name;
+    char *value;
+} envvar_item;
+
+/*
  * Configuration object for the mod_jk module.
  */
 typedef struct
@@ -169,6 +179,8 @@
      */
     int envvars_in_use;
     table *envvars;
+    table *envvars_def;
+    array_header *envvar_items;
 
     server_rec *s;
 } jk_server_conf_t;
@@ -655,25 +667,33 @@
         }
 
         if (conf->envvars_in_use) {
-            array_header *t = ap_table_elts(conf->envvars);
+            const array_header *t = conf->envvar_items;
             if (t && t->nelts) {
                 int i;
-                table_entry *elts = (table_entry *) t->elts;
+                int j = 0;
+                envvar_item *elts = (envvar_item *) t->elts;
                 s->attributes_names =
                     ap_palloc(r->pool, sizeof(char *) * t->nelts);
                 s->attributes_values =
                     ap_palloc(r->pool, sizeof(char *) * t->nelts);
 
                 for (i = 0; i < t->nelts; i++) {
-                    s->attributes_names[i] = elts[i].key;
-                    s->attributes_values[i] =
-                        (char *)ap_table_get(r->subprocess_env, elts[i].key);
-                    if (!s->attributes_values[i]) {
-                        s->attributes_values[i] = elts[i].val;
+                    s->attributes_names[i - j] = elts[i].name;
+                    s->attributes_values[i - j] =
+                        (char *)ap_table_get(r->subprocess_env, elts[i].name);
+                    if (!s->attributes_values[i - j]) {
+                        if (elts[i].has_default) {
+                            s->attributes_values[i - j] = elts[i].value;
+                        }
+                        else {
+                            s->attributes_values[i - j] = "";
+                            s->attributes_names[i - j] = "";
+                            j++;
+                        }
                     }
                 }
 
-                s->num_attributes = t->nelts;
+                s->num_attributes = t->nelts - j;
             }
         }
     }
@@ -1682,9 +1702,10 @@
 
 
     /* env_name is mandatory, default_value is optional.
-     * No value means set the variable to an empty string.
+     * No value means send the attribute only, if the env var is set during 
runtime.
      */
     ap_table_setn(conf->envvars, env_name, default_value ? default_value : "");
+    ap_table_setn(conf->envvars_def, env_name, default_value ? "1" : "0");
 
     return NULL;
 }
@@ -2139,6 +2160,8 @@
 
     c->envvars_in_use = JK_FALSE;
     c->envvars = ap_make_table(p, 0);
+    c->envvars_def = ap_make_table(p, 0);
+    c->envvar_items = ap_make_array(p, 0, sizeof(envvar_item));
 
     c->s = s;
     jk_map_put(c->worker_properties, "ServerRoot", ap_server_root, NULL);
@@ -2215,6 +2238,16 @@
                 }
             }
         }
+        arr = ap_table_elts(base->envvars_def);
+        if (arr) {
+            overrides->envvars_in_use = JK_TRUE;
+            elts = (const table_entry *)arr->elts;
+            for (i = 0; i < arr->nelts; ++i) {
+                if (!ap_table_get(overrides->envvars_def, elts[i].key)) {
+                    ap_table_setn(overrides->envvars_def, elts[i].key, 
elts[i].val);
+                }
+            }
+        }
     }
 
     if (overrides->mount_file_reload == JK_UNSET)
@@ -2395,6 +2428,34 @@
                                  "JkRequestLogFormat format array NULL");
             }
             sconf->options &= ~sconf->exclude_options;
+            if (sconf->envvars_in_use) {
+                int i;
+                const array_header *arr;
+                const table_entry *elts;
+                envvar_item *item;
+                const char *envvar_def;
+
+                arr = ap_table_elts(sconf->envvars);
+                if (arr) {
+                    elts = (const table_entry *)arr->elts;
+                    for (i = 0; i < arr->nelts; ++i) {
+                        item = (envvar_item 
*)ap_push_array(sconf->envvar_items);
+                        if (!item)
+                            jk_error_exit(APLOG_MARK, APLOG_EMERG, srv,
+                                          p, "Memory error");
+                        item->name = elts[i].key;
+                        envvar_def = ap_table_get(sconf->envvars_def, 
elts[i].key);
+                        if (envvar_def && !strcmp("1", envvar_def) ) {
+                            item->value = elts[i].val;
+                            item->has_default = 1;
+                        }
+                        else {
+                            item->value = "";
+                            item->has_default = 0;
+                        }
+                    }
+                }
+            }
         }
     }
 

Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?view=diff&rev=509173&r1=509172&r2=509173
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Mon Feb 19 04:01:40 
2007
@@ -136,6 +136,19 @@
 /* module MODULE_VAR_EXPORT jk_module; */
 AP_MODULE_DECLARE_DATA module jk_module;
 
+/*
+ * Environment variable forward object
+ */
+typedef struct
+{
+    int has_default;
+    char *name;
+    char *value;
+} envvar_item;
+
+/*
+ * Configuration object for the mod_jk module.
+ */
 typedef struct
 {
 
@@ -203,6 +216,8 @@
      */
     int envvars_in_use;
     apr_table_t *envvars;
+    apr_table_t *envvars_def;
+    apr_array_header_t *envvar_items;
 
     server_rec *s;
 } jk_server_conf_t;
@@ -683,25 +698,33 @@
         }
 
         if (conf->envvars_in_use) {
-            const apr_array_header_t *t = apr_table_elts(conf->envvars);
+            const apr_array_header_t *t = conf->envvar_items;
             if (t && t->nelts) {
                 int i;
-                apr_table_entry_t *elts = (apr_table_entry_t *) t->elts;
+                int j = 0;
+                envvar_item *elts = (envvar_item *) t->elts;
                 s->attributes_names = apr_palloc(r->pool,
                                                  sizeof(char *) * t->nelts);
                 s->attributes_values = apr_palloc(r->pool,
                                                   sizeof(char *) * t->nelts);
 
                 for (i = 0; i < t->nelts; i++) {
-                    s->attributes_names[i] = elts[i].key;
-                    s->attributes_values[i] =
-                        (char *)apr_table_get(r->subprocess_env, elts[i].key);
-                    if (!s->attributes_values[i]) {
-                        s->attributes_values[i] = elts[i].val;
+                    s->attributes_names[i - j] = elts[i].name;
+                    s->attributes_values[i - j] =
+                        (char *)apr_table_get(r->subprocess_env, elts[i].name);
+                    if (!s->attributes_values[i - j]) {
+                        if (elts[i].has_default) {
+                            s->attributes_values[i - j] = elts[i].value;
+                        }
+                        else {
+                            s->attributes_values[i - j] = "";
+                            s->attributes_names[i - j] = "";
+                            j++;
+                        }
                     }
                 }
 
-                s->num_attributes = t->nelts;
+                s->num_attributes = t->nelts - j;
             }
         }
     }
@@ -1716,9 +1739,10 @@
     conf->envvars_in_use = JK_TRUE;
 
     /* env_name is mandatory, default_value is optional.
-     * No value means set the variable to an empty string.
+     * No value means send the attribute only, if the env var is set during 
runtime.
      */
     apr_table_setn(conf->envvars, env_name, default_value ? default_value : 
"");
+    apr_table_setn(conf->envvars_def, env_name, default_value ? "1" : "0");
 
     return NULL;
 }
@@ -2263,6 +2287,8 @@
 
     c->envvars_in_use = JK_FALSE;
     c->envvars = apr_table_make(p, 0);
+    c->envvars_def = apr_table_make(p, 0);
+    c->envvar_items = apr_array_make(p, 0, sizeof(envvar_item));
 
     c->s = s;
     jk_map_put(c->worker_properties, "ServerRoot", ap_server_root, NULL);
@@ -2344,6 +2370,16 @@
                 }
             }
         }
+        arr = apr_table_elts(base->envvars_def);
+        if (arr) {
+            overrides->envvars_in_use = JK_TRUE;
+            elts = (const apr_table_entry_t *)arr->elts;
+            for (i = 0; i < arr->nelts; ++i) {
+                if (!apr_table_get(overrides->envvars_def, elts[i].key)) {
+                    apr_table_setn(overrides->envvars_def, elts[i].key, 
elts[i].val);
+                }
+            }
+        }
     }
 
     if (overrides->mount_file_reload == JK_UNSET)
@@ -2680,6 +2716,33 @@
                                          "JkRequestLogFormat format array 
NULL");
                     }
                     sconf->options &= ~sconf->exclude_options;
+                    if (sconf->envvars_in_use) {
+                        int i;
+                        const apr_array_header_t *arr;
+                        const apr_table_entry_t *elts;
+                        envvar_item *item;
+                        const char *envvar_def;
+
+                        arr = apr_table_elts(sconf->envvars);
+                        if (arr) {
+                            elts = (const apr_table_entry_t *)arr->elts;
+                            for (i = 0; i < arr->nelts; ++i) {
+                                item = (envvar_item 
*)apr_array_push(sconf->envvar_items);
+                                if (!item)
+                                    return HTTP_INTERNAL_SERVER_ERROR;
+                                item->name = elts[i].key;
+                                envvar_def = apr_table_get(sconf->envvars_def, 
elts[i].key);
+                                if (envvar_def && !strcmp("1", envvar_def) ) {
+                                    item->value = elts[i].val;
+                                    item->has_default = 1;
+                                }
+                                else {
+                                    item->value = "";
+                                    item->has_default = 0;
+                                }
+                            }
+                        }
+                    }
                 }
             }
             init_jk(pconf, conf, s);

Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?view=diff&rev=509173&r1=509172&r2=509173
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Mon Feb 19 
04:01:40 2007
@@ -26,6 +26,14 @@
   <br />
   <subsection name="Native">
     <changelog>
+      <add>
+      Change semantics of empty defaults for JkEnvVar variables.
+      Until 1.2.19: not allowed. In 1.2.20: send variables as empty strings, if
+      neither set to non empty in config, nor during runtime.
+      Starting with 1.2.21: If config has no second argument only send
+      variable if set (even when set to empty string) during runtime.
+      Allows good combination with condition attribute in tomcat access log. 
(rjung)
+      </add>
       <fix>
         <bug>41610</bug>: Fix incorrect detection of missing Content-Length
         header leading to duplicate headers. Contributed by Boris Maras. 
(rjung)

Modified: tomcat/connectors/trunk/jk/xdocs/reference/apache.xml
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/reference/apache.xml?view=diff&rev=509173&r1=509172&r2=509173
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/reference/apache.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/reference/apache.xml Mon Feb 19 04:01:40 
2007
@@ -209,12 +209,16 @@
 <attribute name="JkEnvVar" required="false"><p>
 Adds a name and an optional default value of environment variable
 that should be sent to servlet-engine as a request attribute.
-If the default value is not given explicitely, the empty string
-will be used as a default.
+If the default value is not given explicitely, the variable
+will only be send, if it is set during runtime.
 <br/>
 This directive can be used multiple times per virtual server.
 <br/>
 The default is empty, so no additional variables will be sent.
+<br/>
+Empty default values are supported since version 1.2.20.
+Not sending variables with empty defaults and empty runtime value
+has been introduced in version 1.2.21.
 </p></attribute>
 
 
@@ -239,6 +243,7 @@
 <br/>
 <br/>
 </p>
+
 </subsection>
 
 <subsection name="Logging">
@@ -571,8 +576,8 @@
 The directive <b>JkEnvVar</b> allows you to forward environment variables from 
Apache server to Tomcat engine.
 The variables can be retrieved on the Tomcat side as request attributes.
 You can add a default value as a second parameter to the directive.
-If the default value is not given explicitely, the empty string
-will be used as a default.
+If the default value is not given explicitely, the variable
+will only be send, if it is set during runtime.
 <br/>
 <br/>
 The variables are inherited from the global server to virtual hosts.
@@ -721,6 +726,8 @@
 <p>
 There is no way to delete entries by dynamic reloading, but you can disable or
 exclude mappings.
+<br/>
+<br/>
 </p>
 
 </subsection>

Modified: tomcat/connectors/trunk/jk/xdocs/webserver_howto/apache.xml
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/webserver_howto/apache.xml?view=diff&rev=509173&r1=509172&r2=509173
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/webserver_howto/apache.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/webserver_howto/apache.xml Mon Feb 19 
04:01:40 2007
@@ -628,8 +628,8 @@
 The directive <b>JkEnvVar</b> allows you to forward environment variables from 
Apache server to Tomcat engine.
 The variables can be retrieved on the Tomcat side as request attributes.
 You can add a default value as a second parameter to the directive.
-If the default value is not given explicitely, the empty string
-will be used as a default.
+If the default value is not given explicitely, the variable
+will only be send, if it is set during runtime.
 <br/>
 <br/>
 The variables are inherited from the global server to virtual hosts.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to