[Varnish 4] Respecting client's Cache-Control: max-age= as TTL
Guillaume Quintard
guillaume at varnish-software.com
Tue Aug 1 09:34:39 CEST 2017
Ah, right, I totally forgot about that, sorry.
Sooooooo, there's no real clean way to do it (that I can see, smarter
people than me may have a solution), but here's what I can offer.
sub vcl_recv {
if (req.restarts == 0) {
unset req.http.force_miss;
} else if (req.http.force_miss) {
set req.hash_alway_miss
}
}
sub vcl_hit {
if (CONDITION TO BYPASS CACHE) {
set req.http.force_miss = "yes";
return(restart);
}
}
--
Guillaume Quintard
On Tue, Aug 1, 2017 at 12:10 AM, Martynas Jusevičius <martynas at atomgraph.com
> wrote:
> Sorry, sent too soon. Here it goes:
>
> Thanks Guillaume.
>
> First I tried return(fetch) as you suggested
>
> sub vcl_hit {
> if (req.http.Cache-Control ~ "max-age=[0-9]*") {
> set req.http.Max-Age = regsub(req.http.Cache-Control,
> "max-age=([0-9]*)", "\1");
> if (obj.age > std.duration(req.http.Max-Age + "s", 1000000s)) {
> std.log("obj.age: " + obj.age + " req.http.Max-Age: " +
> req.http.Max-Age);
> return(fetch);
> }
> }
> ...
>
> but I got an error:
>
> - VCL_call HIT
> - ReqHeader Max-Age: 69
> - VCL_Log obj.age: 102.306 req.http.Max-Age: 69
> - VCL_return fetch
> - VCL_Error change return(fetch) to return(miss) in vcl_hit{}
> - VCL_Error vcl_hit{} returns miss without busy object. Doing pass.
> - VCL_call PASS
> - VCL_return fetch
>
> I did as told and I tried return(miss)
>
> sub vcl_hit {
> if (req.http.Cache-Control ~ "max-age=[0-9]*") {
> set req.http.Max-Age = regsub(req.http.Cache-Control,
> "max-age=([0-9]*)", "\1");
> if (obj.age > std.duration(req.http.Max-Age + "s", 1000000s)) {
> std.log("obj.age: " + obj.age + " req.http.Max-Age: " +
> req.http.Max-Age);
> return(miss);
> }
> }
> ...
>
> but then I got another error:
>
> - VCL_call HIT
> - ReqHeader Max-Age: 69
> - VCL_Log obj.age: 195.391 req.http.Max-Age: 69
> - VCL_return miss
> - VCL_Error vcl_hit{} returns miss without busy object. Doing pass.
> - VCL_call PASS
> - VCL_return fetch
>
> So it looks like the max-age logic is triggered correctly, but what is
> wrong with the return values?
>
> On Tue, Aug 1, 2017 at 12:01 AM, Martynas Jusevičius <
> martynas at atomgraph.com> wrote:
>
>> Thanks Guillaume.
>>
>> First I tried
>>
>> sub vcl_hit {
>> if (req.http.Cache-Control ~ "max-age=[0-9]*") {
>> set req.http.Max-Age = regsub(req.http.Cache-Control,
>> "max-age=([0-9]*)", "\1");
>> if (obj.age > std.duration(req.http.Max-Age + "s", 1000000s)) {
>> std.log("obj.age: " + obj.age + " req.http.Max-Age: " +
>> req.http.Max-Age);
>> return(fetch);
>> }
>> }
>> ...
>>
>> but I got an error:
>>
>> - VCL_call HIT
>> - ReqHeader Max-Age: 69
>> - VCL_Log obj.age: 102.306 req.http.Max-Age: 69
>> - VCL_return fetch
>> - VCL_Error change return(fetch) to return(miss) in vcl_hit{}
>> - VCL_Error vcl_hit{} returns miss without busy object. Doing
>> pass.
>> - VCL_call PASS
>> - VCL_return fetch
>>
>> I did as told and I tried
>>
>>
>> On Mon, Jul 31, 2017 at 9:11 PM, Guillaume Quintard <
>> guillaume at varnish-software.com> wrote:
>>
>>> man vcl
>>>
>>> bereq is filtered to avoid side effects of the client forcing the ttl to
>>> the backed.
>>>
>>> Anyway, by the time you have access to bereq, it's too late for you
>>> since the decision to go to the backend has already been been made.
>>>
>>> --
>>> Guillaume Quintard
>>>
>>>
>>> On Jul 31, 2017 19:56, "Martynas Jusevičius" <martynas at atomgraph.com>
>>> wrote:
>>>
>>> Thanks. What was mostly unclear to me is passing the req header value
>>> all the way to where it's used to set TTL.
>>>
>>> Why doesn't bereq contain the req headers? At least Cache-Control is
>>> gone.
>>>
>>> But I guess that can be done using obj.ttl, which I didn't know about.
>>> Any documentation on that?
>>>
>>> On Mon, 31 Jul 2017 at 18.38, Guillaume Quintard <
>>> guillaume at varnish-software.com> wrote:
>>>
>>>> On github I pointed to the doc explaining how you can return(fetch) to
>>>> ignore a cached object, possibly based on ttl, so you already have half the
>>>> answer.
>>>>
>>>> The other part of the equation is just converting
>>>> req.http.cache-control to a duration and comparing that to obj.ttl. It will
>>>> be similar to what you have done on v3.
>>>>
>>>> --
>>>> Guillaume Quintard
>>>>
>>>> On Jul 31, 2017 18:25, "Martynas Jusevičius" <martynas at atomgraph.com>
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I have been reading quite a bit about Varnish and VCL but found almost
>>>>> no examples with Cache-Control coming from the client request [1].
>>>>>
>>>>> What I want to achieve: if the client sends Cache-Control: max-age=60,
>>>>> TTL becomes 60 s. If the cache hit is fresher than 60 s, deliver it,
>>>>> otherwise fetch a new response from backend (I hope I'm not misusing the
>>>>> VCL terms here) *and* cache it.
>>>>>
>>>>> I had hacked this together in the vcl_fetch section in Varnish 3.x by
>>>>> setting the req.http.Cache-Control max-age value as beresp.ttl, but
>>>>> vcl_fetch is gone in Varnish 4.x.
>>>>>
>>>>> I have received a suggestion to use vcl_hit and/or grace [2], but
>>>>> again -- no examples...
>>>>>
>>>>> Could anyone provide some VCL pseudo-code that
>>>>> uses req.http.Cache-Control value to override TTL? max-age number parsing
>>>>> not necessary, I have figure that out.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Martynas
>>>>>
>>>>> [1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Header
>>>>> s/Cache-Control#Cache_request_directives
>>>>> [2] https://github.com/varnishcache/varnish-cache/issues/201
>>>>> 4#issuecomment-319096566
>>>>>
>>>>> _______________________________________________
>>>>> varnish-misc mailing list
>>>>> varnish-misc at varnish-cache.org
>>>>> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-misc/attachments/20170801/1bf5b939/attachment.html>
More information about the varnish-misc
mailing list