[ 
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

Reply via email to