Search code examples
cachingvarnish

varnish cache real (body) size vs content-length


Sometimes, when an object is not in the cache, varnish will send an object that has a real size smaller than the size declared in the content-length header. For example - only part of the picture.

Is it possible to construct such a rule...? if (beresp.http.content-lenght <> real_object_body_size) { return(retry); }

I wrote a script that tests the same request against the varnish and the backend. It compares the downloaded size with the content-lenght header. The backend, unlike varnish, sometimes ends up with a timeout but the size is always fine. The problem is rare but annoying because the objects are set to long user cache time.


Solution

  • After a few days I can say that the problem was in occasional backend problems with varnish's ability to send a chunked transfer if the object is not in the cache.

    Thank you @Thijs Feryn for pointing this out. I knew about that property but until I read it here, I didn't connect it to my problem at all.

    It seems that "set beresp.do_stream = false;" solved the problem.