From bbc14abb4abf7c8a23d0ad24dccfc750ff37ae5f Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Thu, 8 Dec 2016 18:22:11 +0100 Subject: [PATCH] Fix sprite and glyph loading from remote URLs --- src/serve_rendered.js | 16 +++++++++++++--- src/serve_style.js | 25 ++++++++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/serve_rendered.js b/src/serve_rendered.js index 65860a8..f44dba6 100644 --- a/src/serve_rendered.js +++ b/src/serve_rendered.js @@ -144,9 +144,19 @@ module.exports = function(options, repo, params, id, dataResolver) { }); }; - styleJSON = clone(require(path.join(options.paths.styles, styleFile))); - styleJSON.sprite = 'sprites://' + path.basename(styleFile, '.json'); - styleJSON.glyphs = 'fonts://{fontstack}/{range}.pbf'; + var styleJSONPath = path.join(options.paths.styles, styleFile); + styleJSON = clone(require(styleJSONPath)); + + var httpTester = /^(http(s)?:)?\/\//; + if (!httpTester.test(styleJSON.sprite)) { + styleJSON.sprite = 'sprites://' + + styleJSON.sprite + .replace('{style}', path.basename(styleFile, '.json')) + .replace('{styleJsonFolder}', path.relative(options.paths.sprites, path.dirname(styleJSONPath))); + } + if (!httpTester.test(styleJSON.glyphs)) { + styleJSON.glyphs = 'fonts://' + styleJSON.glyphs; + } var tileJSON = { 'tilejson': '2.0.0', diff --git a/src/serve_style.js b/src/serve_style.js index 71d7529..de0fe54 100644 --- a/src/serve_style.js +++ b/src/serve_style.js @@ -43,11 +43,20 @@ module.exports = function(options, repo, params, id, reportTiles, reportFont) { }; styleJSON.layers.forEach(findFontReferences); - var spritePath = path.join(options.paths.sprites, - path.basename(styleFile, '.json')); + var spritePath; - styleJSON.sprite = 'local://styles/' + id + '/sprite'; - styleJSON.glyphs = 'local://fonts/{fontstack}/{range}.pbf'; + var httpTester = /^(http(s)?:)?\/\//; + if (!httpTester.test(styleJSON.sprite)) { + spritePath = path.join(options.paths.sprites, + styleJSON.sprite + .replace('{style}', path.basename(styleFile, '.json')) + .replace('{styleJsonFolder}', path.relative(options.paths.sprites, path.dirname(styleFile))) + ); + styleJSON.sprite = 'local://styles/' + id + '/sprite'; + } + if (!httpTester.test(styleJSON.glyphs)) { + styleJSON.glyphs = 'local://fonts/{fontstack}/{range}.pbf'; + } repo[id] = styleJSON; @@ -57,7 +66,10 @@ module.exports = function(options, repo, params, id, reportTiles, reportFont) { if (!opt_nokey && req.query.key) { queryParams.unshift('key=' + req.query.key); } - var query = '?' + queryParams.join('&'); + var query = ''; + if (!opt_nokey) { + query = '?' + queryParams.join('&'); + } return url.replace( 'local://', req.protocol + '://' + req.headers.host + '/') + query; }; @@ -75,6 +87,9 @@ module.exports = function(options, repo, params, id, reportTiles, reportFont) { app.get('/' + id + '/sprite:scale(@[23]x)?\.:format([\\w]+)', function(req, res, next) { + if (!spritePath) { + return res.status(404).send('File not found'); + } var scale = req.params.scale, format = req.params.format; var filename = spritePath + (scale || '') + '.' + format;