--- httpd-2.2.6-patched/modules/cache/mod_disk_cache.c 2008-03-25 19:30:01.000000000 +0000 +++ httpd-2.2.6-patched/modules/cache/mod_disk_cache.c 2008-03-25 19:47:51.000000000 +0000 @@ -593,6 +593,7 @@ dobj->updtimeout = conf->updtimeout; dobj->removedirs = conf->removedirs; dobj->header_only = r->header_only; + dobj->bytes_sent = 0; if(r->filename != NULL && strlen(r->filename) > 0) { char buf[34]; @@ -1506,6 +1507,7 @@ { apr_bucket *e; disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj; + apr_off_t bytes_already_done; if(dobj->hfd != NULL) { /* Close header cache file, it won't be needed anymore */ @@ -1529,18 +1531,23 @@ } /* Insert as much as possible as regular file (ie. sendfile():able) */ - if(dobj->file_size > 0) { - if(apr_brigade_insert_file(bb, dobj->bfd, 0, - dobj->file_size, p) == NULL) + /* We need to make sure to skip the beginning of the file if we've + already sent some bytes, e.g., due to mod_proxy */ + if(dobj->file_size > dobj->bytes_sent) { + if(apr_brigade_insert_file(bb, dobj->bfd, dobj->bytes_sent, + dobj->file_size - dobj->bytes_sent, p) == NULL) { return APR_ENOMEM; } + bytes_already_done = dobj->file_size; + } else { + bytes_already_done = dobj->bytes_sent; } /* Insert any remainder as read-while-caching bucket */ - if(dobj->file_size < dobj->initial_size) { - if(diskcache_brigade_insert(bb, dobj->bfd, dobj->file_size, - dobj->initial_size - dobj->file_size, + if(bytes_already_done < dobj->initial_size) { + if(diskcache_brigade_insert(bb, dobj->bfd, bytes_already_done, + dobj->initial_size - bytes_already_done, dobj->updtimeout, p ) == NULL) { @@ -2455,6 +2462,10 @@ } /* Then, populate it with our cached instance */ + + /* in case we've already sent part, e.g. via mod_proxy */ + dobj->bytes_sent = r->bytes_sent; + rv = recall_body(h, r->pool, bb); if (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, --- httpd-2.2.6-patched/modules/cache/mod_disk_cache.h 2008-03-25 19:30:01.000000000 +0000 +++ httpd-2.2.6-patched/modules/cache/mod_disk_cache.h 2008-03-25 19:34:03.000000000 +0000 @@ -124,6 +124,8 @@ apr_interval_time_t updtimeout; /* Cache update timeout */ disk_cache_info_t disk_info; /* Disk header information. */ + + apr_off_t bytes_sent; /* Copy of r->bytes_sent before calling recall_body */ } disk_cache_object_t;