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]