diff --git a/lib/cartodb/cartodb_windshaft.js b/lib/cartodb/cartodb_windshaft.js index 52655dc6..69687eff 100644 --- a/lib/cartodb/cartodb_windshaft.js +++ b/lib/cartodb/cartodb_windshaft.js @@ -6,17 +6,6 @@ var _ = require('underscore') var CartodbWindshaft = function(serverOptions) { - // set the cache chanel info to invalidate the cache on the frontend server - serverOptions.afterTileRender = function(req, res, tile, headers, callback) { - var ttl = global.environment.varnish.ttl || 86400; - Cache.generateCacheChannel(req, function(channel){ - res.header('X-Cache-Channel', channel); - res.header('Last-Modified', new Date().toUTCString()); - res.header('Cache-Control', 'no-cache,max-age='+ttl+',must-revalidate, public'); - callback(null, tile, headers); - }); - }; - if(serverOptions.cache_enabled) { console.log("cache invalidation enabled, varnish on ", serverOptions.varnish_host, ' ', serverOptions.varnish_port); Cache.init(serverOptions.varnish_host, serverOptions.varnish_port); diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index 9a56d360..183d7cae 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -1,6 +1,7 @@ var _ = require('underscore') , Step = require('step') - , cartoData = require('./carto_data'); + , cartoData = require('./carto_data') + , Cache = require('./cache_validator'); module.exports = function(){ var me = { @@ -17,6 +18,28 @@ module.exports = function(){ log_format: '[:date] :req[X-Real-IP] \033[90m:method\033[0m \033[36m:req[Host]:url\033[0m \033[90m:status :response-time ms -> :res[Content-Type]\033[0m' }; + // Set the cache chanel info to invalidate the cache on the frontend server + // + // @param req The request object. + // The function will have no effect unless req.res exists. + // It is expected that req.params contains 'table' and 'dbname' + // + // @param cb function(err, channel) will be called when ready. + // the channel parameter will be null if nothing was added + // + me.addCacheChannel = function(req, cb) { + // skip non-GET requests, or requests for which there's no response + if ( req.method != 'GET' || ! req.res ) { cb(null, null); return; } + var res = req.res; + var ttl = global.environment.varnish.ttl || 86400; + Cache.generateCacheChannel(req, function(channel){ + res.header('X-Cache-Channel', channel); + res.header('Last-Modified', new Date().toUTCString()); + res.header('Cache-Control', 'no-cache,max-age='+ttl+',must-revalidate, public'); + cb(null, channel); // add last-modified too ? + }); + } + /** * Whitelist input and get database name & default geometry type from * subdomain/user metadata held in CartoDB Redis @@ -45,6 +68,8 @@ module.exports = function(){ callback(null, xml); } + var that = this; + Step( function getPrivacy(){ cartoData.authorize(req, this); @@ -66,10 +91,14 @@ module.exports = function(){ cartoData.getGeometryType(req, this); }, function finishSetup(err, data){ + if ( err ) { callback(err, req); return; } + if (!_.isNull(data)) _.extend(req.params, {geom_type: data}); - callback(err, req); + that.addCacheChannel(req, function(err, chan) { + callback(err, req); + }); } ); }; diff --git a/test/acceptance/server.js b/test/acceptance/server.js index b61c4eb6..b6806cf4 100644 --- a/test/acceptance/server.js +++ b/test/acceptance/server.js @@ -40,6 +40,7 @@ suite('server', function() { method: 'GET' },{ status: 200, + headers: { 'X-Cache-Channel': 'cartodb_test_user_1_db:my_table' }, body: '{"style":"#my_table {marker-fill: #FF6600;marker-opacity: 1;marker-width: 8;marker-line-color: white;marker-line-width: 3;marker-line-opacity: 0.9;marker-placement: point;marker-type: ellipse;marker-allow-overlap: true;}"}' }, function() { done(); }); }); @@ -261,6 +262,7 @@ suite('server', function() { method: 'GET' },{ status: 200, + headers: { 'X-Cache-Channel': 'cartodb_test_user_1_db:my_tablez' }, body: '{"infowindow":null}' }, function() { done(); }); }); @@ -326,7 +328,8 @@ suite('server', function() { method: 'GET' },{ status: 200, - headers: { 'Content-Type': 'text/javascript; charset=utf-8; charset=utf-8' } + headers: { 'Content-Type': 'text/javascript; charset=utf-8; charset=utf-8', + 'X-Cache-Channel': 'cartodb_test_user_1_db:gadm4' } }, function() { done(); }); }); @@ -391,7 +394,7 @@ suite('server', function() { method: 'GET' },{ status: 200, - headers: { 'Content-Type': 'image/png' } + headers: { 'Content-Type': 'image/png', 'X-Cache-Channel': 'cartodb_test_user_1_db:gadm4' } }, function() { done(); }); });