$r->finfowas because it's required in order to do some 1.0-type manipulations.
Apache::CacheContent(which is based on the code here). the trick that makes it all work is that you write out a flat-file version of semi-dynamic content after URI translation then allow Apache to serve it as a flat file via
now, the tricky part to this poor-man's caching is that Apache still thinks it has the result of it's default URI-to-filename translation, so not only does it serve your file up, but it also uses that file in decisions on whether to return
HTTP_NOT_MODIFIED, which gives you an extra boost for little cost.
the thing is, Apache's default content handler does this
do you see it? you've updated
$r->filename() but Apache is using
$r->finfo->mtime() in it's decision on whether to send
mod_perl 1.0 adds a bit of magic behind the scenes so that calls to
$r->filename() updates the underlying
finfo structure as well. in mod_perl 2.0, there is less magic but more API exposure, which means you need to update the
finfo data yourself. so, in mod_perl 2.0 the idiom looks like this
$r->finfo->stat($file, APR::FINFO_NORM, $r->pool);
which first sets the filename then updates the file's
finfo so that Apache uses the proper data in making its caching (and other) decisions.
I love this stuff.