[ http://issues.apache.org/jira/browse/MODPYTHON-98?page=all ] Graham Dumpleton closed MODPYTHON-98: -------------------------------------
> wrong handler supplied to req.add_handler() generates error > ----------------------------------------------------------- > > Key: MODPYTHON-98 > URL: http://issues.apache.org/jira/browse/MODPYTHON-98 > Project: mod_python > Type: Bug > Components: core > Versions: 3.2.7, 3.1.4 > Reporter: Graham Dumpleton > Fix For: 3.2.7 > > The documentation for req.add_handler() states: > Note: There is no checking being done on the validity of the handler name. > If you pass this function an invalid handler it will simply be ignored. > In other words, get the name of the handler wrong and it is supposed to just > ignore it. This is not actually the case, instead it will generate an > exception when it goes to process the handler: > Mod_python error: "PythonHandler example::handler_3" > Traceback (most recent call last): > File > "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/apache.py", > line 291, in HandlerDispatch > arg=req, silent=hlist.silent) > File > "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/apache.py", > line 538, in resolve_object > raise AttributeError, s > AttributeError: module '/Users/grahamd/Sites/add_handler/example.py' > contains no 'handler_3' > This can be seen with .htaccess file of: > SetHandler mod_python > PythonAccessHandler example > PythonHandler example::handler_1 > PythonDebug On > and example.py file containing: > from mod_python import apache > def accesshandler(req): > apache.log_error("accesshandler") > req.add_handler("PythonHandler","example::handler_3") > return apache.OK > def handler_1(req): > apache.log_error("handler_1") > req.content_type = 'text/plain' > req.write("HELLO") > return apache.OK > def handler_2(req): > apache.log_error("handler_2") > return apache.OK > Either the documentation is wrong and an exception is desired, or more likely > this is an extension of the prior problem with hlist.silent as described as > being a problem in other ways in MODPYTHON-46. > In that case the logic of SILENT/NOTSILENT was the wrong way around and it > was fixed by reversing the definitions of the two. In doing this though, it > didn't cover cases where a "silent" flag is passed to hlist_new() and > hlist_append() in the req_add_handler() function of requestobject.c. > Specfically, there are calls to hlist_new() and hlist_append() in that > function: > hlist_append(self->request_rec->pool, self->hlo->head, > handler, dir, 0); > hle = hlist_new(self->request_rec->pool, handler, dir, 0); > hlist_append(self->request_rec->pool, hle, handler, dir, 0); > These should be written as: > hlist_append(self->request_rec->pool, self->hlo->head, > handler, dir, SILENT); > hle = hlist_new(self->request_rec->pool, handler, dir, SILENT); > hlist_append(self->request_rec->pool, hle, handler, dir, SILENT); > If this change were made, the code would then behaves conformant with the > documentation as far as being silent, however it highlights a further issue. > This further issue is that although it is silent when the handler name is > wrong, this results in apache.DECLINED being returned for the handler that > couldn't be found. Because apache.DECLINED is returned, Apache will try and > interpret the URL again and if possible serve up a static file etc. > For the above example code this then means that if "example.py" was used in > the URL, the browser gets back a response of: > HELLOfrom mod_python import apache > def accesshandler(req): > apache.log_error("accesshandler") > req.add_handler("PythonHandler","example::handler_3") > return apache.OK > def handler_1(req): > apache.log_error("handler_1") > req.content_type = 'text/plain' > req.write("HELLO") > return apache.OK > def handler_2(req): > apache.log_error("handler_2") > return apache.OK > That is, the content as returned by handler_1(), followed by the contents of > the example.py file. > If instead the URL wasn't 'example.py' but say 'other.py' with that not > existing, get back: > HELLO > OK > The requested URL /~grahamd/add_handler/foo.py was not found on this server. > Apache/2.0.51 (Unix) mod_python/3.2.5b Python/2.3 Server at localhost Port > 8080 > In some ways, this behaviour suggests that the behaviour whereby it raised an > exception was probably a better way of handling the situtation anyway. Thus, > maybe the documentation should instead be changed and the code left as is, or > at least the 0 arguments changed to be NOTSLIENT to make it more obvious what > it is doing. > The other option is to change the code to use SILENT, but then document the > strange things that can result if the specified handler doesn't exist. > Comments?????? -- 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