]> granicus.if.org Git - apache/commitdiff
mod_cache: Make sure that the moving of the CACHE filter to another
authorGraham Leggett <minfrin@apache.org>
Sat, 12 Feb 2011 23:21:18 +0000 (23:21 +0000)
committerGraham Leggett <minfrin@apache.org>
Sat, 12 Feb 2011 23:21:18 +0000 (23:21 +0000)
point within a subrequest is limited to affecting filters in that
subrequest only.

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

modules/cache/mod_cache.c

index 1faa2e745ef0b215a9f6d033e0c3bc131ff4c22d..f02922d563633b3379ac57c1f918784972dc0916 100644 (file)
@@ -298,11 +298,13 @@ static int cache_quick_handler(request_rec *r, int lookup)
  * second filter, and return true. If the second filter is not present at
  * all, the first filter is removed, and false is returned. If neither
  * filter is present, false is returned and this function does nothing.
+ * If a stop filter is specified, processing will stop once this filter is
+ * reached.
  */
 static int cache_replace_filter(ap_filter_t *next, ap_filter_rec_t *from,
-        ap_filter_rec_t *to) {
+        ap_filter_rec_t *to, ap_filter_rec_t *stop) {
     ap_filter_t *ffrom = NULL, *fto = NULL;
-    while (next) {
+    while (next && next->frec != stop) {
         if (next->frec == from && !next->ctx) {
             ffrom = next;
         }
@@ -439,7 +441,8 @@ static int cache_handler(request_rec *r)
                  * filter will remain in place.
                  */
                 if (cache_replace_filter(r->output_filters,
-                        cache_filter_handle, cache_save_handle)) {
+                        cache_filter_handle, cache_save_handle,
+                        ap_get_input_filter_handle("SUBREQ_CORE"))) {
                     ap_log_rerror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS,
                             r, "Replacing CACHE with CACHE_SAVE "
                             "filter for %s", r->uri);
@@ -513,7 +516,8 @@ static int cache_handler(request_rec *r)
      * lie *after* the original location of the CACHE filter will remain in
      * place.
      */
-    if (cache_replace_filter(r->output_filters, cache_filter_handle, cache_out_handle)) {
+    if (cache_replace_filter(r->output_filters, cache_filter_handle,
+            cache_out_handle, ap_get_input_filter_handle("SUBREQ_CORE"))) {
         ap_log_rerror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS,
                 r, "Replacing CACHE with CACHE_OUT filter for %s",
                 r->uri);