From: Graham Leggett <minfrin@apache.org>
Date: Sat, 12 Nov 2011 21:24:47 +0000 (+0000)
Subject: mod_cache: Make sure we merge headers correctly when we handle a non
X-Git-Tag: 2.5.0-alpha~7913
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d4780b88c95d8b1c2d8724a1491ed25eb4645c2e;p=apache

mod_cache: Make sure we merge headers correctly when we handle a non
cacheable conditional response. PR52120.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1201331 13f79535-47bb-0310-9956-ffa450edef68
---

diff --git a/CHANGES b/CHANGES
index a0df1b9bcd..b611a77d66 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.3.16
 
+  *) mod_cache: Make sure we merge headers correctly when we handle a
+     non cacheable conditional response. PR52120. [Graham Leggett]
+
   *) core: Set MaxMemFree 2048 by default. [Stefan Fritsch]
 
   *) mpm_event: Fix assertion failure during very high load. [Stefan Fritsch]
diff --git a/modules/cache/mod_cache.c b/modules/cache/mod_cache.c
index b97a21c285..af7be13523 100644
--- a/modules/cache/mod_cache.c
+++ b/modules/cache/mod_cache.c
@@ -1081,6 +1081,20 @@ static int cache_save_filter(ap_filter_t *f, apr_bucket_brigade *in)
             APR_BRIGADE_INSERT_TAIL(bb, bkt);
         }
         else {
+            /* RFC 2616 10.3.5 states that entity headers are not supposed
+             * to be in the 304 response.  Therefore, we need to combine the
+             * response headers with the cached headers *before* we update
+             * the cached headers.
+             *
+             * However, before doing that, we need to first merge in
+             * err_headers_out and we also need to strip any hop-by-hop
+             * headers that might have snuck in.
+             */
+            r->headers_out = ap_cache_cacheable_headers_out(r);
+
+            /* Merge in our cached headers.  However, keep any updated values. */
+            cache_accept_headers(cache->handle, r, 1);
+
             cache->provider->recall_body(cache->handle, r->pool, bb);
 
             bkt = apr_bucket_eos_create(bb->bucket_alloc);