[ http://issues.apache.org/jira/browse/MODPYTHON-46?page=all ] Nicolas Lehuen resolved MODPYTHON-46: -------------------------------------
Fix Version: 3.2 Resolution: Fixed > PythonHandlerModule directive is broken. > ---------------------------------------- > > Key: MODPYTHON-46 > URL: http://issues.apache.org/jira/browse/MODPYTHON-46 > Project: mod_python > Type: Bug > Components: core > Versions: 3.1.4 > Reporter: Graham Dumpleton > Fix For: 3.2 > Attachments: silent.diff.txt > > Documentation for PythonHandlerModule says: > PythonHandlerModule can be used an alternative to Python*Handler directives. > The module specified in this handler will be searched for existence of > functions > matching the default handler function names, and if a function is found, it > will > be executed. > The suggestion is that it will not complain if a particular handler is > defined, ie., > only executes the ones it finds and doesn't worry about the rest. The example > even supports this by saying that: > For example, instead of: > PythonAutenHandler mymodule > PythonHandler mymodule > PythonLogHandler mymodule > one can simply say > PythonHandlerModule mymodule > BTW, "PythonAutenHandler" is spelt wrong in documentation, not by me. > The "mod_python.c" code also seems be coded so that if a handler is defined > in the module that it will not complain. > python_directive_handler(cmd, mconfig, "PythonPostReadRequestHandler", > val, SILENT); > python_directive_handler(cmd, mconfig, "PythonTransHandler", val, SILENT); > python_directive_handler(cmd, mconfig, "PythonHeaderParserHandler", val, > SILENT); > python_directive_handler(cmd, mconfig, "PythonAccessHandler", val, > SILENT); > python_directive_handler(cmd, mconfig, "PythonAuthzHandler", val, SILENT); > python_directive_handler(cmd, mconfig, "PythonTypeHandler", val, SILENT); > python_directive_handler(cmd, mconfig, "PythonHandler", val, SILENT); > python_directive_handler(cmd, mconfig, "PythonInitHandler", val, SILENT); > python_directive_handler(cmd, mconfig, "PythonLogHandler", val, SILENT); > python_directive_handler(cmd, mconfig, "PythonCleanupHandler", val, > SILENT); > python_directive_handler(cmd, srv_conf, "PythonConnectionHandler", val, > SILENT); > Ie., it has "SILENT" option and not "NOTSILENT" as is case when single > handler is > specified. > Problem is that using "PythonHandlerModule" it gives back 500 error and if > "PythonDebug" is on you will see in the browser: > Mod_python error: "PythonHeaderParserHandler mptest" > Traceback (most recent call last): > File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 291, > in HandlerDispatch > arg=req, silent=hlist.silent) > File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 519, > in resolve_object > raise AttributeError, s > AttributeError: module '/home/grahamd/public_html/phases/mptest.py' > contains no 'headerparserhandler' > The passing of "SILENT" thus seems to not work. > The definitions of SILENT and NOTSILENT are: > #define SILENT 0 > #define NOTSILENT 1 > This eventually gets set as hlist.silent and gets passed as "silent" argument > of > the "resolve_object()" method. > In the resolve_object() call of apache.py where this is checked, it is > checked as: > # don't throw attribute errors when silent > if silent and not hasattr(obj, obj_str): > return None > # this adds a little clarity if we have an attriute error > if obj == module and not hasattr(module, obj_str): > if hasattr(module, "__file__"): > s = "module '%s' contains no '%s'" % (module.__file__, > obj_str) > raise AttributeError, s > Is the logic the wrong way around here or am I just going nuts? > The result of "resolve_object()" is used as: > if object: > ... > elif hlist.silent: > result = DECLINED > This is supposed to propogate ignoring of the fact that the handler is > missing, > but again logic is wrong way. > The simple solution may be: > #define NOTSILENT 0 > #define SILENT 1 > All uses of this silent flag needs to be reviewed though to determine if this > is > going to stuff up other areas of the code. -- 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