CherryPy Static Tool with Caching Tool

I wrote a bug report to cherrypy-devel.

Already, I have my own fix inn Unguent.

Here is the report for the recored.

I found that using Static Tool with Caching Tool doesn't work well,
in some situations.

I am using version 3.1.2, and checked the code in the repository
(trunk) as well.

Note that when we use or staticfile.handler directly, with Caching Tool, it works well.

Suppose we have a configuration like this:
tools.caching.on = True

tools.staticfile.on = True
tools.staticfile.filename = 'site/robots.txt'

Then, staticfile is always called, even though it cached as well.

That's because both of Static Tool and Caching Tool use
'before_handler' hook.

The logic of Caching Tool is that, it disable request.handler when it
founds a page in cache.  The code is:

-------------------------  root/trunk/py3/cherrypy/
389   class CachingTool(Tool):
390       """Caching Tool for CherryPy."""
392       def _wrapper(self, **kwargs):
393           request = cherrypy.serving.request
394           if _caching.get(**kwargs):
395               request.handler = None
396           else:
397               if request.cacheable:
398                   # Note the devious technique here of adding hooks on the fly
399                   request.hooks.attach('before_finalize', _caching.tee_output,
400                                        priority = 90)

(BTW, should _caching.get be self.callable here?)

It doesn't stop Static Tool's 'before_handler' hook to be called.

I think that possible fix would be:

(1) Let staticdir or staticfile check if request.handler == None or not.

(2) Then, modify lib/, so that it sets request.handler as
    well when it raises HTTPRedirect.  The place is here:

------------------------- root/trunk/py3/cherrypy/lib/
359           try:
360               # Note that validate_since depends on a Last-Modified header;
361               # this was put into the cached copy, and should have been
362               # resurrected just above (response.headers = cache_data[1]).
363               cptools.validate_since()
364           except cherrypy.HTTPRedirect:
365               x = sys.exc_info()[1]
366               if x.status == 304:
367                   cherrypy._cache.tot_non_modified += 1
+                     request.handler = None
368               raise