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;