Graham Dumpleton wrote ..
> Graham Dumpleton wrote ..
> > > How does req.server.get_options() differ from req.server.get_config(),
> > > which already exists?
> > 
> > I still see what is in get_config() as special, ie., the values for
> > actual directives. Just don't think it is good to mix them.
> 
> Looking at this further, the distinction between req.get_config() and
> req.server.get_config() seems to be all broken. The code for PythonDebug
> is:
> 
> /**
>  ** directive_PythonDebug
>  **
>  *      This function called whenever PythonDebug directive
>  *      is encountered.
>  */
> static const char *directive_PythonDebug(cmd_parms *cmd, void *mconfig,
>                                          int val) {
>     const char *rc = python_directive_flag(mconfig, "PythonDebug", val,
> 0);
> 
>     if (!rc) {
>         py_config *conf = ap_get_module_config(cmd->server->module_config,
>                                                &python_module);
> 
>         return python_directive_flag(conf, "PythonDebug", val, 0);
>     }
>     return rc;
> }
> 
> The python_directive_flag() function always returns NULL and so it adds
> the config value to both table objects. This means that local values for
> the directives in a directory/location/files/host context are going to
> overwrite the global ones in req.server.
> 
> This code should perhaps similarly be looking to see if cmd->path is
> NULL. 

Thus, FWIW, I get what I would expect when I change the code to:

/**
 ** directive_PythonDebug
 **
 *      This function called whenever PythonDebug directive
 *      is encountered.
 */
static const char *directive_PythonDebug(cmd_parms *cmd, void *mconfig,
                                         int val) { 
    const char *rc = python_directive_flag(mconfig, "PythonDebug", val, 0);
    
    if (!cmd->path) {
        py_config *conf = ap_get_module_config(cmd->server->module_config,
                                               &python_module);
        
        return python_directive_flag(conf, "PythonDebug", val, 0);
    }
    return rc;
}

It isn't just this directive processor though, all of them should have:

  if (!rc) {

changed to:

  if (!cmd->path) {

The actual return values from the function are really meaningless as
they are always NULL.

Graham

Reply via email to