[ http://issues.apache.org/jira/browse/MODPYTHON-134?page=all ]
Graham Dumpleton updated MODPYTHON-134: --------------------------------------- Fix Version: 3.3 > Setting PythonDebug to Off, doesn't override On setting in parent scope. > ------------------------------------------------------------------------ > > Key: MODPYTHON-134 > URL: http://issues.apache.org/jira/browse/MODPYTHON-134 > Project: mod_python > Type: Bug > Components: core > Versions: 3.2.7 > Reporter: Graham Dumpleton > Assignee: Graham Dumpleton > Fix For: 3.3 > > If you put: > PythonDebug On > in your main Apache configuration file, one would assume that you can then in > a .htaccess file say: > PythonDebug Off > and that in the .htaccess file would override that in the main Apache > configuration for any requests landing in the directory the .htaccess file is > for. That is, that PythonDebug would be Off. > You might assume this, but it doesn't work. > Similarly, even within a .htaccess file, if you have: > PythonDebug On > <Files xxx> > PythonDebug Off > </Files> > one would assume that accessing "/xxx" in that directory would see > PythonDebug being Off. > That doesn't work either. > The problem comes about from the fact that each container context has a > separate table object. All these table objects are merged together, with > values in more specific containers pertaining to a request, overriding those > from a parent container. Unfortunately, in mod_python 3.X (wasn't the case in > 2.7), the python_directive_flag() function was added and coded to not put an > entry in the table object for the Off case. > The current code for the python_directive_flag() function is: > 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; > } > Note that the line section: > if (set) { > apr_table_set(conf->directives, key, "0"); > } > was only added back in mod_python 3.2.7 specifically to fix problem with > PythonAutoReload not working as documented in MODPYTHON-106. Back in > mod_python 2.7, setting the value to "0" is what always occured, it didn't > use to use unset: > apr_table_unset(conf->directives, key); > Since the unset instead of adding in "0" was used, there was no table object > value for Off and so it can't override On in a parent container and so it > still inherits the On value. Thus why it can't be turned Off once On. > Seems the only solution is to go back to using: > 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_set(conf->directives, key, "0"); > } > return NULL; > } > But to do this, other parts of mod_python.c are going to have to be changed. > Specifically MODPYTHON-106 identified: > 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. > Thus code associated with PythonInterpPerDirectory and > PythonInterpPerDirective is going to have to be changed to check the value in > the table object and see if it is "1". There seems no other choice now. > Note that any user code which also merely checks for the existing of the > directive, such as PythonDebug, without testing the value would also need to > be changed as it will potentially not work properly. -- 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