/*
- * $Id: refresh.cc,v 1.17 1997/11/12 00:09:04 wessels Exp $
+ * $Id: refresh.cc,v 1.18 1998/04/22 16:22:15 rousskov Exp $
*
* DEBUG: section 22 Refresh Calculation
* AUTHOR: Harvest Derived
#define REFRESH_DEFAULT_PCT (time_t)20
#define REFRESH_DEFAULT_MAX (time_t)259200
+static const refresh_t *
+refreshLimits(const char *url)
+{
+ const refresh_t *R;
+ for (R = Config.Refresh; R; R = R->next) {
+ if (!regexec(&(R->compiled_pattern), url, 0, 0, 0))
+ return R;
+ }
+ return NULL;
+}
+
/*
* refreshCheck():
* return 1 if its time to revalidate this entry, 0 otherwise
int
refreshCheck(const StoreEntry * entry, const request_t * request, time_t delta)
{
- refresh_t *R;
+ const refresh_t *R;
time_t min = REFRESH_DEFAULT_MIN;
int pct = REFRESH_DEFAULT_PCT;
time_t max = REFRESH_DEFAULT_MAX;
debug(22, 3) ("refreshCheck: YES: Required Authorization\n");
return 1;
}
- for (R = Config.Refresh; R; R = R->next) {
- if (regexec(&(R->compiled_pattern), storeUrl(entry), 0, 0, 0) != 0)
- continue;
+ if ((R = refreshLimits(storeUrl(entry)))) {
min = R->min;
pct = R->pct;
max = R->max;
pattern = R->pattern;
- break;
}
debug(22, 3) ("refreshCheck: Matched '%s %d %d%% %d'\n",
pattern, (int) min, pct, (int) max);
debug(22, 3) ("refreshCheck: NO: non-HTTP request\n");
return 0;
}
- debug(22, 3) ("refreshCheck: YES: lastvalid <= lastmod\n");
+ debug(22, 3) ("refreshCheck: YES: lastvalid <= lastmod (%d <= %d)\n",
+ (int)entry->timestamp, (int)entry->lastmod);
return 1;
}
factor = 100 * age / (entry->timestamp - entry->lastmod);
return 1;
}
+/* returns an approximate time when refreshCheck() may return true */
+time_t
+refreshWhen(const StoreEntry * entry)
+{
+ const refresh_t *R;
+ time_t refresh_time = squid_curtime;
+ time_t min = REFRESH_DEFAULT_MIN;
+ time_t max = REFRESH_DEFAULT_MAX;
+ int pct = REFRESH_DEFAULT_PCT;
+ const char *pattern = ".";
+
+ assert(entry);
+ debug(22, 3) ("refreshWhen: key '%s'\n", storeKeyText(entry->key));
+ debug(22, 3) ("refreshWhen: url '%s'\n", storeUrl(entry));
+ if (EBIT_TEST(entry->flag, ENTRY_REVALIDATE)) {
+ debug(22, 3) ("refreshWhen: NOW: Required Authorization\n");
+ return refresh_time;
+ }
+ debug(22, 3) ("refreshWhen: entry: exp: %d, tstamp: %d, lmt: %d\n",
+ entry->expires, entry->timestamp, entry->lastmod);
+ if ((R = refreshLimits(storeUrl(entry)))) {
+ min = R->min;
+ max = R->max;
+ pct = R->pct;
+ pattern = R->pattern;
+ }
+ debug(22, 3) ("refreshWhen: Matched '%s %d %d%% %d'\n",
+ pattern, (int) min, pct, (int) max);
+ /* convert to absolute numbers */
+ min += entry->timestamp;
+ max += entry->timestamp;
+ if (-1 < entry->expires) {
+ debug(22, 3) ("refreshWhen: expires set\n");
+ refresh_time = entry->expires;
+ } else
+ if (entry->timestamp <= entry->lastmod) {
+ debug(22, 3) ("refreshWhen: lastvalid <= lastmod\n");
+ refresh_time = squid_curtime;
+ } else {
+ refresh_time = pct * (entry->timestamp - entry->lastmod)/100 + entry->timestamp;
+ debug(22, 3) ("refreshWhen: using refresh pct\n");
+ }
+ /* take min/max into account, max takes priority over min */
+ if (refresh_time < min)
+ refresh_time = min;
+ if (refresh_time > max)
+ refresh_time = max;
+ debug(22, 3) ("refreshWhen: answer: %d (in %d secs)\n",
+ refresh_time, (int)(refresh_time - squid_curtime));
+ return refresh_time;
+}
+
time_t
getMaxAge(const char *url)
{
- refresh_t *R;
+ const refresh_t *R;
debug(22, 3) ("getMaxAge: '%s'\n", url);
- for (R = Config.Refresh; R; R = R->next) {
- if (regexec(&(R->compiled_pattern), url, 0, 0, 0) == 0)
- return R->max;
- }
- return REFRESH_DEFAULT_MAX;
+ if ((R = refreshLimits(url)))
+ return R->max;
+ else
+ return REFRESH_DEFAULT_MAX;
}