[
http://issues.apache.org/jira/browse/MODPYTHON-98?page=comments#action_12360191
]
Graham Dumpleton commented on MODPYTHON-98:
-------------------------------------------
Am probably being bad sticking multiple problems against one bug report, but
they are all related. :-)
That said, there is a third problem lurking in this code. With a .htaccess file
of:
SetHandler mod_python
PythonAccessHandler example
# PythonHandler example::handler_1
PythonDebug On
Ie., use SetHandler, but don't define PythonHandler. If you now have an
accesshandler() with:
def accesshandler(req):
apache.log_error("accesshandler")
req.add_handler("PythonHandler","example::handler_1")
return apache.OK
then Apache will core dump. The core dump isn't at the point that
req.add_handler() is called but some later point when the content handler phase
is processed (I think).
More later when I track it down.
> 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, 3.1.4
> Reporter: Graham Dumpleton
>
> 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