You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-dev@quetz.apache.org by "Jim Gallacher (JIRA)" <ji...@apache.org> on 2005/08/09 16:37:35 UTC

[jira] Commented: (MODPYTHON-46) PythonHandlerModule directive is broken.

    [ http://issues.apache.org/jira/browse/MODPYTHON-46?page=comments#action_12318162 ] 

Jim Gallacher commented on MODPYTHON-46:
----------------------------------------

I've reviewed the source code and according to src/include/hlist.c:

    typedef struct hl_entry {
        const char *handler;
        const char *directory;
        int silent;  /* 1 for PythonHandlerModule, where
                        if a handler is not found in a module,
                        no error should be reported */
        struct hl_entry *next;
    } hl_entry;

So Graham is correct. The logic of SILENT/NOTSILENT is reversed.

Also it looks like SILENT/NOTSILENT is only used in the context of python_directive_handler, so I don't see any side effects from making this change.

I have no objection to disabling PythonConnectionHandler within PythonHandlerModule. If there are no objections I'll apply Graham's patch.




> 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
>  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


Re: [jira] Commented: (MODPYTHON-46) PythonHandlerModule directive is broken.

Posted by Nick <ni...@dd.revealed.net>.
I don't have a jira account, but I wanted to comment that it's highly 
unlikely you would ever have a ConnectionHandler and any other type of 
handler defined, since ConnectionHandler pretty much co-opts apache's 
handling of the connection at all.  So +1 on PythonHandlerModule completely 
ignoring ConnectionHandler.

Nick

Jim Gallacher (JIRA) wrote:
>     [ http://issues.apache.org/jira/browse/MODPYTHON-46?page=comments#action_12318162 ] 
> 
> Jim Gallacher commented on MODPYTHON-46:
> ----------------------------------------
> 
> I've reviewed the source code and according to src/include/hlist.c:
> 
>     typedef struct hl_entry {
>         const char *handler;
>         const char *directory;
>         int silent;  /* 1 for PythonHandlerModule, where
>                         if a handler is not found in a module,
>                         no error should be reported */
>         struct hl_entry *next;
>     } hl_entry;
> 
> So Graham is correct. The logic of SILENT/NOTSILENT is reversed.
> 
> Also it looks like SILENT/NOTSILENT is only used in the context of python_directive_handler, so I don't see any side effects from making this change.
> 
> I have no objection to disabling PythonConnectionHandler within PythonHandlerModule. If there are no objections I'll apply Graham's patch.
> 
> 
> 
> 
> 
>>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
>> 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.
> 
> 


Re: [jira] Commented: (MODPYTHON-46) PythonHandlerModule directive is broken.

Posted by "Gregory (Grisha) Trubetskoy" <gr...@apache.org>.
On Tue, 9 Aug 2005, Jim Gallacher (JIRA) wrote:

> I have no objection to disabling PythonConnectionHandler within 
> PythonHandlerModule. If there are no objections I'll apply Graham's 
> patch.

+1

Grisha