Assignment to req.filename and POSIX style pathnames.
-----------------------------------------------------

         Key: MODPYTHON-171
         URL: http://issues.apache.org/jira/browse/MODPYTHON-171
     Project: mod_python
        Type: Bug

  Components: core  
    Versions: 3.2.8    
    Reporter: Graham Dumpleton


In Apache, all the path names relating to the matched target of a request are 
dealt with as POSIX style paths. That is, a forward slash is used as the 
directory separator even if the platform is Win32. The only real allowance for 
Win32 stuff is that drive specifiers may still occur in which case the drive 
letter is always converted to upper case.

All the Apache C API functions dealing with manipulation of and specifically 
generation of modified paths will by default ensure that paths are maintained 
in this POSIX style. To have a path be generated in its true native form, you 
need to provide special flags to functions.

When an Apache module writer works with paths, they would normally rely on the 
default behaviour and so long as they use the functions provided by the Apache 
C API, the result will always be consistent.

Where would all this be a potential issue is where modules set the 
request_rec->filename attribute, ie., the req.filename attribute of the 
mod_python request object. In a C Apache module, as the result is always going 
to be in the correct form when request_rec->filename is modified, everything 
still comes out okay.

The problem in mod_python, or more perhaps when using Python, is that all the 
directory manipulation routines in os.path as they exist on Win32 platform can 
generate paths with back slashes in them. Further, it is often convenient to 
use __file__ attribute of modules in some way, which again is going to use back 
slashes on Win32 platform. If the results from either of these is assigned to 
req.filename, the result request_rec->filename attribute is no longer going to 
be in the POSIX style form which is would normally exist if only the Apache C 
APIs were used.

One area where this causes a problem (and which isn't fixed) was described in 
MODPYTHON-161, whereby setting req.filename to a path which includes back 
slashes instead of the required POSIX style forward slashes can result in the 
wrong interpreter being selected for a subsequent phase if the 
PythonInterpPerDirectory directive is being used. The case used for any drive 
specifier could similarly be a problem.

Now although Python provides os.path.normpath(), that normalises a path in the 
native format. There is no function which can normalise a path and output it in 
the POSIX style format. Trying to create a function in Python which does may 
not yield the same result as what Apache expects.

The actual function in Apache which can be used to normalise paths and which 
outputs the POSIX style path required is apr_filepath_merge(). The question is, 
should this be exposed in some way so that it is useable from mod_python, or 
for the req.filename case, should assignment to req.filename automatically 
trigger normalisation of the path to ensure that it simply just works all the 
time and isn't dependent on a user of mod_python realising they need to 
normalise it first in the POSIX style to ensure their code is portable across 
platforms.




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