From 721d19a58b4469d7844b64f67ff57b6b9664a66a Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Mon, 13 Sep 2010 22:35:51 +0000 Subject: [PATCH] Handle the case where a brigade might have buckets following the eos bucket. In this case the cache provider passes all buckets through as is once the cached entry is marked as done. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@996713 13f79535-47bb-0310-9956-ffa450edef68 --- modules/cache/mod_disk_cache.c | 10 +++++++++- modules/cache/mod_disk_cache.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/cache/mod_disk_cache.c b/modules/cache/mod_disk_cache.c index 62511b0e16..2cead23bb6 100644 --- a/modules/cache/mod_disk_cache.c +++ b/modules/cache/mod_disk_cache.c @@ -1051,13 +1051,21 @@ static apr_status_t store_body(cache_handle_t *h, request_rec *r, e = APR_BRIGADE_FIRST(in); + /* are we done completely? if so, pass any trailing buckets right through */ + if (dobj->done) { + APR_BUCKET_REMOVE(e); + APR_BRIGADE_INSERT_TAIL(out, e); + continue; + } + /* have we seen eos yet? */ if (APR_BUCKET_IS_EOS(e)) { seen_eos = 1; + dobj->done = 1; APR_BUCKET_REMOVE(e); APR_BRIGADE_CONCAT(out, dobj->bb); APR_BRIGADE_INSERT_TAIL(out, e); - continue; + break; } /* honour flush buckets, we'll get called again */ diff --git a/modules/cache/mod_disk_cache.h b/modules/cache/mod_disk_cache.h index d962d9d5eb..bfafff91f6 100644 --- a/modules/cache/mod_disk_cache.h +++ b/modules/cache/mod_disk_cache.h @@ -73,6 +73,7 @@ typedef struct disk_cache_object { apr_bucket_brigade *bb; /* Set aside brigade */ apr_off_t offset; /* Max size to set aside */ apr_time_t timeout; /* Max time to set aside */ + int done; /* Is the attempt to cache complete? */ } disk_cache_object_t; -- 2.40.0