Respond with 204 when vector tile is empty
This commit is contained in:
parent
a35b1e3e86
commit
eccc3597aa
@ -201,6 +201,10 @@ BaseController.prototype.sendError = function(req, res, err, label) {
|
||||
|
||||
var statusCode = findStatusCode(err);
|
||||
|
||||
if (err.message === 'Tile does not exist' && req.params.format === 'mvt') {
|
||||
statusCode = 204;
|
||||
}
|
||||
|
||||
debug('[%s ERROR] -- %d: %s, %s', label, statusCode, err, err.stack);
|
||||
|
||||
// If a callback was requested, force status to 200
|
||||
|
58
test/acceptance/mvt.js
Normal file
58
test/acceptance/mvt.js
Normal file
@ -0,0 +1,58 @@
|
||||
require('../support/test_helper');
|
||||
|
||||
var assert = require('../support/assert');
|
||||
var TestClient = require('../support/test-client');
|
||||
|
||||
function createMapConfig (sql) {
|
||||
sql = sql || [
|
||||
'select',
|
||||
' *',
|
||||
'from',
|
||||
' populated_places_simple_reduced',
|
||||
].join('\n');
|
||||
|
||||
return {
|
||||
version: '1.6.0',
|
||||
layers: [{
|
||||
type: "cartodb",
|
||||
options: {
|
||||
sql: sql,
|
||||
cartocss: TestClient.CARTOCSS.POINTS,
|
||||
cartocss_version: '2.3.0',
|
||||
interactivity: 'cartodb_id'
|
||||
}
|
||||
}]
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
describe('mvt', function () {
|
||||
const testCases = [
|
||||
{
|
||||
desc: 'should get empty mvt with code 204 (no content)',
|
||||
coords: { z: 0, x: 0, y: 0 },
|
||||
format: 'mvt',
|
||||
mapConfig: createMapConfig('select 1 as cartodb_id, null::geometry as the_geom_webmercator')
|
||||
}
|
||||
];
|
||||
|
||||
testCases.forEach(function (test) {
|
||||
it(test.desc, done => {
|
||||
const testClient = new TestClient(test.mapConfig, 1234);
|
||||
const { z, x, y } = test.coords;
|
||||
const options = {
|
||||
format: test.format,
|
||||
status: 204
|
||||
};
|
||||
|
||||
testClient.getTile(z, x, y, options, (err, res) => {
|
||||
assert.ifError(err);
|
||||
|
||||
assert.ifError(err);
|
||||
assert.equal(res.statusCode, 204);
|
||||
assert.equal(res.body, '');
|
||||
testClient.drain(done);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
@ -525,7 +525,7 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) {
|
||||
};
|
||||
|
||||
var expectedResponse = {
|
||||
status: 200,
|
||||
status: params.status || 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf-8'
|
||||
}
|
||||
@ -542,7 +542,12 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) {
|
||||
|
||||
if (isMvt) {
|
||||
request.encoding = 'binary';
|
||||
expectedResponse.headers['Content-Type'] = 'application/x-protobuf';
|
||||
|
||||
if (expectedResponse.status === 200) {
|
||||
expectedResponse.headers['Content-Type'] = 'application/x-protobuf';
|
||||
} else if (expectedResponse.status === 204) {
|
||||
expectedResponse.headers['Content-Type'] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
var isGeojson = format.match(/geojson$/);
|
||||
@ -561,15 +566,16 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) {
|
||||
|
||||
assert.response(server, request, expectedResponse, function(res, err) {
|
||||
assert.ifError(err);
|
||||
|
||||
var obj;
|
||||
|
||||
if (isPng) {
|
||||
obj = mapnik.Image.fromBytes(new Buffer(res.body, 'binary'));
|
||||
}
|
||||
else if (isMvt) {
|
||||
obj = new mapnik.VectorTile(z, x, y);
|
||||
obj.setDataSync(new Buffer(res.body, 'binary'));
|
||||
if (res.body) {
|
||||
obj = new mapnik.VectorTile(z, x, y);
|
||||
obj.setDataSync(new Buffer(res.body, 'binary'));
|
||||
}
|
||||
}
|
||||
else {
|
||||
obj = JSON.parse(res.body);
|
||||
|
Loading…
Reference in New Issue
Block a user