[ http://issues.apache.org/jira/browse/MODPYTHON-128?page=all ]
Graham Dumpleton updated MODPYTHON-128: --------------------------------------- Fix Version/s: 3.3 Another item which it would be nice to get resolved for mod_python 3.3. My latest thinking on this is that we need an actual C based Python object which wraps an instance of a apr_finfo_t structure. This object would be what is returned when req.finfo is accessed. The Python object would need to preserve the existing means of accessing attributes by assuming object is a tuple and accessing values by using special index keys defined in mod_python.apache file. This means of access though would be seen as being obsolete and supported for backward compatibility only. Instead, going forward code should be converted to use attribute style access, thus we would have: OLD --> req.finfo[mod_python.apache.FINFO_FILETYPE] NEW -->req.finfo.filetype As much as makes sense of the apr_finfo_t object would be made accessible. In respect of the original problem of how to update req.finfo when req.filename is changed, two new functions would be added to mod_python.apache. This would be: mod_python.apache.stat(fname, wanted) mod_python.apache.lstat(fname, wanted) The 'wanted' argument would be replaced with bitwise or of new global constants defined in mod_python equivalent to: #define APR_FINFO_LINK 0x00000001 /**< Stat the link not the file itself if it is a link */ #define APR_FINFO_MTIME 0x00000010 /**< Modification Time */ #define APR_FINFO_CTIME 0x00000020 /**< Creation or inode-changed time */ #define APR_FINFO_ATIME 0x00000040 /**< Access Time */ #define APR_FINFO_SIZE 0x00000100 /**< Size of the file */ #define APR_FINFO_CSIZE 0x00000200 /**< Storage size consumed by the file */ #define APR_FINFO_DEV 0x00001000 /**< Device */ #define APR_FINFO_INODE 0x00002000 /**< Inode */ #define APR_FINFO_NLINK 0x00004000 /**< Number of links */ #define APR_FINFO_TYPE 0x00008000 /**< Type */ #define APR_FINFO_USER 0x00010000 /**< User */ #define APR_FINFO_GROUP 0x00020000 /**< Group */ #define APR_FINFO_UPROT 0x00100000 /**< User protection bits */ #define APR_FINFO_GPROT 0x00200000 /**< Group protection bits */ #define APR_FINFO_WPROT 0x00400000 /**< World protection bits */ #define APR_FINFO_ICASE 0x01000000 /**< if dev is case insensitive */ #define APR_FINFO_NAME 0x02000000 /**< ->name in proper case */ #define APR_FINFO_MIN 0x00008170 /**< type, mtime, ctime, atime, size */ #define APR_FINFO_IDENT 0x00003000 /**< dev and inode */ #define APR_FINFO_OWNER 0x00030000 /**< user and group */ #define APR_FINFO_PROT 0x00700000 /**< all protections */ #define APR_FINFO_NORM 0x0073b170 /**< an atomic unix apr_stat() */ #define APR_FINFO_DIRENT 0x02000000 /**< an atomic unix apr_dir_read() */ The result of the stat() and lstat() functions would be an instance of the Python object wrapping the apr_finfo_t structure. Finally, the req.finfo attribute would be made such that it could be assigned to by an instance of the Python object wrapping an apr_finfo_t structure. Thus: req.filename = newfile req.finfo = mod_python.apache.stat(newfile, mod_python.apache.APR_FINFO_MIN) The affect of the assignment would be that the finfo attribute in the underlying request_rec structure would be updated from that held in the Python wrapper object for the apr_finfo_t structure instance returned by the stat() call. This should all be quite doable and the similarity to the Apache API is preserved. > Have assigning req.filename automatically update req.finfo. > ----------------------------------------------------------- > > Key: MODPYTHON-128 > URL: http://issues.apache.org/jira/browse/MODPYTHON-128 > Project: mod_python > Issue Type: Improvement > Components: core > Affects Versions: 3.3 > Reporter: Graham Dumpleton > Assigned To: Graham Dumpleton > Fix For: 3.3 > > Attachments: MP128_20060423_grahamd_1.diff > > > Although it is possible to assign a new value to "req.filename", it is not > possible to update "req.finfo" based on the new filename. > Suggest that if "req.filename" is assigned a new value, that apr_stat() be > automatically called to update "req.finfo". Ie., internally mod_python would > do something like: > apr_stat(&r->finfo, r->filename, APR_FINFO_MIN, r->pool); > I believe that mod_perl supports a similar feature, but would need to confirm > this. > Related to "req.filename", the "req.canonical_filename" should also be > writable as when changing "req.filename" the latter should also by rights be > updated as well. -- 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