diff options
author | Justin Erenkrantz <jerenkrantz@apache.org> | 2007-05-17 18:25:13 +0000 |
---|---|---|
committer | Justin Erenkrantz <jerenkrantz@apache.org> | 2007-05-17 18:25:13 +0000 |
commit | 1b7508dd219a9a3bfd925454ef5bd0bb79bc424f (patch) | |
tree | 871ba30f86fbc0648e47ec7527a41d96d6bd70ea | |
parent | c795f75fea2166379ea41c961e56939e18b51901 (diff) | |
download | httpd-1b7508dd219a9a3bfd925454ef5bd0bb79bc424f.tar.gz |
mod_cache: Let Cache-Control max-age set the expiration of the cached
representation if Expires is not set.
* modules/cache/mod_cache.c
(cache_save_filter): If Cache-Control max-age is set and Expires isn't,
let that value control our expiration.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@539063 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | modules/cache/mod_cache.c | 35 |
2 files changed, 32 insertions, 6 deletions
@@ -2,6 +2,9 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) mod_cache: Let Cache-Control max-age set the expiration of the cached + representation if Expires is not set. [Justin Erenkrantz] + *) mod_disk_cache: Allow Vary'd responses to be refreshed properly. [Justin Erenkrantz] diff --git a/modules/cache/mod_cache.c b/modules/cache/mod_cache.c index a2f4f3ef45..6f4170a36b 100644 --- a/modules/cache/mod_cache.c +++ b/modules/cache/mod_cache.c @@ -701,19 +701,42 @@ static int cache_save_filter(ap_filter_t *f, apr_bucket_brigade *in) } /* if no expiry date then - * if lastmod + * if Cache-Control: max-age + * expiry date = date + max-age + * else if lastmod * expiry date = date + min((date - lastmod) * factor, maxexpire) * else * expire date = date + defaultexpire */ if (exp == APR_DATE_BAD) { char expire_hdr[APR_RFC822_DATE_LEN]; + char *max_age_val; - /* if lastmod == date then you get 0*conf->factor which results in - * an expiration time of now. This causes some problems with - * freshness calculations, so we choose the else path... - */ - if ((lastmod != APR_DATE_BAD) && (lastmod < date)) { + if (ap_cache_liststr(r->pool, cc_out, "max-age", &max_age_val) && + max_age_val != NULL) { + apr_int64_t x; + + errno = 0; + x = apr_atoi64(max_age_val); + if (errno) { + x = conf->defex; + } + else { + x = x * MSEC_ONE_SEC; + } + if (x < conf->minex) { + x = conf->minex; + } + if (x > conf->maxex) { + x = conf->maxex; + } + exp = date + x; + } + else if ((lastmod != APR_DATE_BAD) && (lastmod < date)) { + /* if lastmod == date then you get 0*conf->factor which results in + * an expiration time of now. This causes some problems with + * freshness calculations, so we choose the else path... + */ apr_time_t x = (apr_time_t) ((date - lastmod) * conf->factor); if (x < conf->minex) { |