summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGraham Leggett <minfrin@apache.org>2010-09-14 00:35:51 +0200
committerGraham Leggett <minfrin@apache.org>2010-09-14 00:35:51 +0200
commit721d19a58b4469d7844b64f67ff57b6b9664a66a (patch)
tree154368c24b7ace4f12a68279a4d5550d168a2669
parentUpdate transformations. (diff)
downloadapache2-721d19a58b4469d7844b64f67ff57b6b9664a66a.tar.xz
apache2-721d19a58b4469d7844b64f67ff57b6b9664a66a.zip
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
Diffstat (limited to '')
-rw-r--r--modules/cache/mod_disk_cache.c10
-rw-r--r--modules/cache/mod_disk_cache.h1
2 files changed, 10 insertions, 1 deletions
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;