From 216c877f4bab9648ff693ce62fef03d9c63906e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Tue, 7 Nov 2017 11:07:38 +0100 Subject: [PATCH] verctor error middleware --- lib/cartodb/controllers/layergroup.js | 10 ++++++--- lib/cartodb/middleware/vector-error.js | 30 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 lib/cartodb/middleware/vector-error.js diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index c5e4c53a..573c53ee 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -7,6 +7,7 @@ var BaseController = require('./base'); var cors = require('../middleware/cors'); var userMiddleware = require('../middleware/user'); var allowQueryParams = require('../middleware/allow-query-params'); +var vectorError = require('../middleware/vector-error'); var DataviewBackend = require('../backends/dataview'); var AnalysisStatusBackend = require('../backends/analysis-status'); @@ -57,7 +58,8 @@ LayergroupController.prototype.register = function(app) { cors(), userMiddleware, this.prepareContext, - this.tile.bind(this) + this.tile.bind(this), + vectorError() ); app.get( @@ -65,7 +67,8 @@ LayergroupController.prototype.register = function(app) { cors(), userMiddleware, this.prepareContext, - this.tile.bind(this) + this.tile.bind(this), + vectorError() ); app.get( @@ -74,7 +77,8 @@ LayergroupController.prototype.register = function(app) { userMiddleware, validateLayerRouteMiddleware, this.prepareContext, - this.layer.bind(this) + this.layer.bind(this), + vectorError() ); app.get( diff --git a/lib/cartodb/middleware/vector-error.js b/lib/cartodb/middleware/vector-error.js new file mode 100644 index 00000000..3da6ff3b --- /dev/null +++ b/lib/cartodb/middleware/vector-error.js @@ -0,0 +1,30 @@ +const fs = require('fs'); + +const timeoutErrorVectorTile = fs.readFileSync(__dirname + '/../../../assets/render-timeout-fallback.mvt', {encoding: null}); + +module.exports = function vectorError() { + return function vectorErrorMiddleware(err, req, res, next) { + if(req.params.format === 'mvt') { + + if (isTimeoutError(err)) { + res.set('Content-Type', 'application/x-protobuf'); + return res.status(429).send(timeoutErrorVectorTile); + } + } + + next(err); + } +} + + +function isRenderTimeoutError (err) { + return err.message === 'Render timed out'; +} + +function isDatasourceTimeoutError (err) { + return err.message && err.message.match(/canceling statement due to statement timeout/i); +} + +function isTimeoutError (err) { + return isRenderTimeoutError(err) || isDatasourceTimeoutError(err); +} \ No newline at end of file