quetz-mod_python-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Graham Dumpleton (JIRA)" <j...@apache.org>
Subject [jira] Created: (MODPYTHON-46) PythonHandlerModule directive is broken.
Date Sun, 10 Apr 2005 06:26:16 GMT
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


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
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


Mime
View raw message