From: Jim Jagielski Date: Fri, 18 May 2007 12:41:14 +0000 (+0000) Subject: Backport: X-Git-Tag: 2.2.5~207 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=297c7af35f8c2eaa6fd42217688d3d8312183b6a;p=thirdparty%2Fapache%2Fhttpd.git Backport: * mod_cache: Let Cache-Control max-age set the expiration date. Trunk version of patch: http://svn.apache.org/viewvc?view=rev&revision=539063 2.2.x version of patch: http://people.apache.org/~jerenkrantz/max-age-expire-2.2.x.patch (No ->minex in 2.2.x) +1: jerenkrantz, fielding, striker git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@539430 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 41643a1f86b..88c92d465bc 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.5 + *) mod_cache: Let Cache-Control max-age set the expiration of the cached + representation if Expires is not set. [Justin Erenkrantz] + *) mod_cache: Allow caching of requests with query arguments when Cache-Control max-age is explicitly specified. [Justin Erenkrantz] diff --git a/STATUS b/STATUS index b7b0263ad8e..18877a4b75a 100644 --- a/STATUS +++ b/STATUS @@ -86,14 +86,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: +1: jfclere, rpluem, wrowe jerenkrantz says: Does not apply cleanly to 2.2.x. - * mod_cache: Let Cache-Control max-age set the expiration date. - Trunk version of patch: - http://svn.apache.org/viewvc?view=rev&revision=539063 - 2.2.x version of patch: - http://people.apache.org/~jerenkrantz/max-age-expire-2.2.x.patch - (No ->minex in 2.2.x) - +1: jerenkrantz, fielding, striker - PATCHES PROPOSED TO BACKPORT FROM TRUNK: * ApacheMonitor: Fix Windows Vista detection. diff --git a/modules/cache/mod_cache.c b/modules/cache/mod_cache.c index e83eba80f46..3dadcf26331 100644 --- a/modules/cache/mod_cache.c +++ b/modules/cache/mod_cache.c @@ -701,19 +701,39 @@ 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 present + * 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->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->maxex) {