diff --git a/config/environments/development.js.example b/config/environments/development.js.example index ed0aaf58..1e59ebf3 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -326,6 +326,7 @@ var config = { purge_enabled: false, // whether the purge/invalidation mechanism is enabled in varnish or not secret: 'xxx', ttl: 86400, + fallbackTtl: 300, layergroupTtl: 86400 // the max-age for cache-control header in layergroup responses } // this [OPTIONAL] configuration enables invalidating by surrogate key in fastly diff --git a/config/environments/production.js.example b/config/environments/production.js.example index bc34db81..42aecabd 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -326,6 +326,7 @@ var config = { purge_enabled: false, // whether the purge/invalidation mechanism is enabled in varnish or not secret: 'xxx', ttl: 86400, + fallbackTtl: 300, layergroupTtl: 86400 // the max-age for cache-control header in layergroup responses } // this [OPTIONAL] configuration enables invalidating by surrogate key in fastly diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index 41f8e281..5083ec11 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -326,6 +326,7 @@ var config = { purge_enabled: false, // whether the purge/invalidation mechanism is enabled in varnish or not secret: 'xxx', ttl: 86400, + fallbackTtl: 300, layergroupTtl: 86400 // the max-age for cache-control header in layergroup responses } // this [OPTIONAL] configuration enables invalidating by surrogate key in fastly diff --git a/config/environments/test.js.example b/config/environments/test.js.example index 05c5e94c..34edb917 100644 --- a/config/environments/test.js.example +++ b/config/environments/test.js.example @@ -328,6 +328,7 @@ var config = { purge_enabled: false, // whether the purge/invalidation mechanism is enabled in varnish or not secret: 'xxx', ttl: 86400, + fallbackTtl: 300, layergroupTtl: 86400 // the max-age for cache-control header in layergroup responses } // this [OPTIONAL] configuration enables invalidating by surrogate key in fastly diff --git a/lib/cartodb/api/middlewares/cache-control-header.js b/lib/cartodb/api/middlewares/cache-control-header.js index d72ee0c3..38d05baf 100644 --- a/lib/cartodb/api/middlewares/cache-control-header.js +++ b/lib/cartodb/api/middlewares/cache-control-header.js @@ -1,21 +1,42 @@ 'use strict'; const ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365; +const FIVE_MINUTES_IN_SECONDS = 60 * 5; +const FALLBACK_TTL = global.environment.varnish.fallbackTtl || FIVE_MINUTES_IN_SECONDS -module.exports = function setCacheControlHeader ({ ttl = ONE_YEAR_IN_SECONDS, revalidate = false } = {}) { +module.exports = function setCacheControlHeader ({ + ttl = ONE_YEAR_IN_SECONDS, + fallbackTtl = FALLBACK_TTL, + revalidate = false +} = {}) { return function setCacheControlHeaderMiddleware (req, res, next) { if (req.method !== 'GET') { return next(); } - const directives = [ 'public', `max-age=${ttl}` ]; + const { mapConfigProvider = { getAffectedTables: callback => callback() } } = res.locals; - if (revalidate) { - directives.push('must-revalidate'); - } + mapConfigProvider.getAffectedTables((err, affectedTables) => { + if (err) { + global.logger.warn('ERROR generating Cache Control Header:', err); + return next(); + } - res.set('Cache-Control', directives.join(',')); + const directives = [ 'public' ] - next(); + if (affectedTables && !affectedTables.getTables().some(table => !!table.updated_at)) { + directives.push(`max-age=${fallbackTtl}`); + } else { + directives.push(`max-age=${ttl}`); + } + + if (revalidate) { + directives.push('must-revalidate'); + } + + res.set('Cache-Control', directives.join(',')); + + next(); + }); }; };