Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to prevent caching based on the size of the backend response in Varnish?

We're caching for a problematic IIS server that sometimes just sends empty responses (0 bytes) instead of proper ones. Caching these responses would be a disaster, and we have no way of fixing the problem as it's not our server. Instead I'd like to instruct Varnish to not cache responses from the backend if they are empty (0 bytes).

Reading the VCL reference (https://www.varnish-cache.org/docs/4.0/reference/vcl.html) I can't see any obvious way of solving this.

Can it be done?

like image 780
Hubro Avatar asked Mar 08 '16 13:03

Hubro


2 Answers

If you wanted to use it as a integer to see if greater then or less then value, use std.

import std; 

if (std.integer(beresp.http.content-length, 0) < 500) {
  #logic here 
}
like image 82
Teebu Avatar answered Dec 28 '22 08:12

Teebu


The size of the response should be available as a HTTP header.

Example (in vcl_backend_response):

if (beresp.http.Content-Length == "0") {
    return(retry);   # Retries the request
}

or:

if (beresp.http.Content-Length == "0") {
    beresp.uncacheable = true;   # Prevents object from being cached
}
like image 24
Hubro Avatar answered Dec 28 '22 10:12

Hubro