[ http://issues.apache.org/jira/browse/MODPYTHON-106?page=all ]
Jim Gallacher resolved MODPYTHON-106:
-------------------------------------
Fix Version: 3.2
Resolution: Fixed
> PythonAutoReload directive can't be turned off in config.
> ---------------------------------------------------------
>
> Key: MODPYTHON-106
> URL: http://issues.apache.org/jira/browse/MODPYTHON-106
> Project: mod_python
> Type: Bug
> Components: core
> Versions: 3.1.4, 3.1.3, 3.2
> Reporter: Graham Dumpleton
> Fix For: 3.2
> Attachments: mod_python.c.diff.20060102-1
>
> In mod_python 2.7.11, the code for handling the PythonAutoReload directive
> was:
> static const char *directive_PythonAutoReload(cmd_parms *cmd,
> void *mconfig, int val) {
> if (val)
> return python_directive(cmd, mconfig, "PythonAutoReload", "1");
> else
> return python_directive(cmd, mconfig, "PythonAutoReload", "0");
> }
> Thus, if PythonAutoReload was set to "Off", the config table object was
> loaded with PythonAutoReload set to "0".
> In mod_python 3.X at some point, it was changed to:
> static const char *python_directive_flag(void * mconfig,
> char *key, int val)
> {
> py_config *conf;
>
> conf = (py_config *) mconfig;
>
> if (val) {
> apr_table_set(conf->directives, key, "1");
> }
> else {
> apr_table_unset(conf->directives, key);
> }
>
> return NULL;
> }
> static const char *directive_PythonAutoReload(cmd_parms *cmd,
> void *mconfig, int val) {
> const char *rc = python_directive_flag(mconfig, "PythonAutoReload", val);
> if (!rc) {
> py_config *conf = ap_get_module_config(cmd->server->module_config,
> &python_module);
> return python_directive_flag(conf, "PythonAutoReload", val);
> }
> return rc;
> }
> Since that change, when PythonAutoReload was set ot "Off", no "0" value entry
> was added to the config table object, instead, if there was an existing entry
> it was removed. The removal would come into play when the option was set to
> "On" at global scope in main Apache configuration and then set to "Off" in a
> .htaccess file or other lesser scope such as a Directory directive.
> The end result was that there was only an entry for PythonAutoReload in the
> config table object when it was set. When it existed, its value was "1".
> The problem now is that the code which checks for PythonAutoReload in
> mod_python.apache module uses:
> module = import_module(module_name,
>
> autoreload=int(config.get("PythonAutoReload", 1)),
> log=debug)
> That is, if the PythonAutoReload option doesn't exist in the config table
> object, it defaults to the auto reload feature being turned On.
> Thus, if PythonAutoReload is set to "On" in the configuration files, the
> Python code will find the value "1" and thus auto reload will be enabled.
> Because of the C code changes above though, when PythonAutoReload is set to
> "Off" in the config, no entry is put in the config table object at all and
> because the Python code can't find it, it defaults to using "1" with the
> result that auto reload will again be on.
> In other words, it isn't possible to turn the feature off through the Apache
> configuration directive.
> One solution is to change python_directive_flag() function to take an
> additional argument whereby it can be specified that "0" should be set for
> the value instead of the value being removed. Thus:
> static const char *python_directive_flag(void * mconfig,
> char *key, int val, int set)
> {
> py_config *conf;
> conf = (py_config *) mconfig;
> if (val) {
> apr_table_set(conf->directives, key, "1");
> }
> else {
> if (set) {
> apr_table_set(conf->directives, key, "0");
> }
> else {
> apr_table_unset(conf->directives, key);
> }
> }
> return NULL;
> }
> All calls to this function except for PythonAutoReload case should supply "0"
> for additional argument, with "1" being supplied for PythonAutoReload case.
> One can't just always set it to "0", as other code in mod_python.c uses the
> fact that an option exists to mean it is set. Ie., it doesn't check the
> value, thus setting it to "0" will cause that code to think the option used
> in that case (PythonInterpPerDirectory, PythonInterpPerDirective) is set to
> on when it isn't, thus causing that to stop working correctly.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira