Date parsing/formatting and type coercion functions in VCL
Dmitry Panov
dmitry.panov at yahoo.co.uk
Fri Mar 4 15:35:49 CET 2011
Hi guys,
From RFC2616:
Also, if the response does have a Last-Modified time, the heuristic
expiration value SHOULD be no more than some fraction of the interval
since that time. A typical setting of this fraction might be 10%.
Some browsers (at least Firefox -- see
https://developer.mozilla.org/en/HTTP_Caching_FAQ) seem to follow this
recommendation.
Vernish does not implement it which is fair enough and if someone wanted
it they could use an inline C like this:
if ((beresp.ttl == 120s || !beresp.http.Cache-Control) &&
!beresp.http.Expires &&
beresp.http.Date && beresp.http.Last-Modified) {
C{
char *lm = VRT_GetHdr(sp, HDR_BERESP, "\016last-modified:");
char *d = VRT_GetHdr(sp, HDR_BERESP, "\005date:");
if (lm && d) {
time_t lm_t, d_t;
lm_t = TIM_parse(lm);
d_t = TIM_parse(d);
if (d_t > 0 && d_t > lm_t) {
double ma = (d_t - lm_t) / 10;
VRT_l_beresp_ttl(sp, ma);
char buf[16];
snprintf(buf, sizeof(buf), "max-age=%d", (int)ma);
VRT_SetHdr(sp, HDR_BERESP, "\016Cache-Control:",
buf, vrt_magic_string_end);
}
}
}C
}
However I just thought, wouldn't it be better if someone could write
something like this:
if (beresp.default_ttl_used && beresp.http.Date &&
beresp.http.Last-Modified) {
beresp.ttl = (ParseDate(beresp.http.Date) -
ParseDate(beresp.http.Last-Modified))/10;
beresp.http.Cache-Control = "max-age="+int(beresp.ttl);
}
What's missing here:
- default_ttl_used flag which should be set to true if no cache
validators were found in the backend response (this should be easy to
implement with the new exp structure).
- ParseDate() function which could be just a wrapper around TIM_parse().
- int() function which should convert the argument to integer.
All these don't seem very hard to implement and it would be really
helpful in many cases. What do you think?
Best regards,
--
Dmitry Panov
More information about the varnish-dev
mailing list