I've been trying to find a solution to a problem that mod_cache has with handling Etag's properly. I'm working with Apache 2.0.51. Below is a diff to ./server/util_script.c that seems to fix the problem...
FWIW, I committed some changes to mod_cache earlier this afternoon (about 10 minutes after you sent this email, actually) that fix this by not depending upon ap_scan_script_header_err(). Using ap_scan_script_header_err() was just wrong for mod_cache as it has these types of goofy side effects. Now, everything goes into r->headers_out not r->err_headers_out.
So, I'd recommend trying a httpd 2.0 HEAD snapshot.
function sticks the Etag value in the r->err_headers_out table. Then, mod_cache later calls ap_meets_conditions() which expects to find an Etag value in r->headers_out.
I will comment that it's possible ap_meets_conditions() should look in r->err_headers_out. But, I'm not completely sure if that's right either.
Regardless, please try out the latest CVS and see if it is fixed. It may get merged back to APACHE_2_0_BRANCH and into 2.0.52, but I'd like confirmation that what we have now fixes these types of problems before starting the backport process. -- justin