Got it! Or at least why <= wouldn't cache objects at all, and > had caching working. DateTime().timeTime() returns a float (resolution of more than 1 second). The If-Modified-Since sends an int (resolution of a second, as required by HTTP protocol). HTTP 1.1 recommends If-Modified-Since send the Last-Modified of the cached object. But the Last-Modified header is different than _p_mtime - _p_mtime is a float, most likely not a whole number, while Last-Modified only has a resolution of seconds - it's a int. So the 304 is never sent if you use 'self._p_mtime <= ms'. The fix is simple:
in lib/python/OFS/Image.py, we do this:
if int(self._p_mtime) <= ms: RESPONSE.setStatus(304) return RESPONSE
instead of:
if self._p_mtime > ms: RESPONSE.setStatus(304) return RESPONSE
As it turns out, this doesn't fix my problems. My self._p_mtime is always an integral number, but ms is often too small by several nanoseconds due to what looks like a floating point error. This solution always seems to work for me. if self._p_mtime <= round(ms, 1): --jfarr