From: Justin Erenkrantz Date: Thu, 17 May 2007 18:25:13 +0000 (+0000) Subject: mod_cache: Let Cache-Control max-age set the expiration of the cached X-Git-Tag: 2.3.0~1804 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b7508dd219a9a3bfd925454ef5bd0bb79bc424f;p=apache 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 --- diff --git a/CHANGES b/CHANGES index 7835948d09..f8e06aa5cb 100644 --- a/CHANGES +++ b/CHANGES @@ -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) {