From aa1ab07b58066435a9123a0feeb8d28d8131c93f Mon Sep 17 00:00:00 2001 From: Lucas Wojciechowski Date: Mon, 13 Jun 2016 14:11:49 -0700 Subject: [PATCH] Refactor for clarity and robustness --- js/util/mapbox.js | 150 ++++++++++++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 66 deletions(-) diff --git a/js/util/mapbox.js b/js/util/mapbox.js index 19d70ac117f..27f387ce703 100644 --- a/js/util/mapbox.js +++ b/js/util/mapbox.js @@ -2,10 +2,10 @@ var config = require('./config'); var browser = require('./browser'); -var url = require('url'); -var querystring = require('querystring'); +var URL = require('url'); +var util = require('./util'); -function normalizeURL(mapboxURL, pathPrefix, accessToken) { +function normalizeURL(url, pathPrefix, accessToken) { accessToken = accessToken || config.ACCESS_TOKEN; if (!accessToken && config.REQUIRE_ACCESS_TOKEN) { @@ -13,8 +13,8 @@ function normalizeURL(mapboxURL, pathPrefix, accessToken) { 'See https://www.mapbox.com/developers/api/#access-tokens'); } - var httpsURL = mapboxURL.replace(/^mapbox:\/\//, config.API_URL + pathPrefix); - httpsURL += httpsURL.indexOf('?') !== -1 ? '&access_token=' : '?access_token='; + url = url.replace(/^mapbox:\/\//, config.API_URL + pathPrefix); + url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token='; if (config.REQUIRE_ACCESS_TOKEN) { if (accessToken[0] === 's') { @@ -22,86 +22,104 @@ function normalizeURL(mapboxURL, pathPrefix, accessToken) { 'See https://www.mapbox.com/developers/api/#access-tokens'); } - httpsURL += accessToken; + url += accessToken; } - return httpsURL; + return url; } -module.exports.normalizeStyleURL = function(styleURL, accessToken) { - var urlObject = url.parse(styleURL, true); - - if (urlObject.protocol !== 'mapbox:') - return styleURL; - - var formattedQuery = ''; - - if (Object.keys(urlObject.query).length !== 0) { - formattedQuery = '?' + querystring.stringify(urlObject.query); +module.exports.normalizeStyleURL = function(url, accessToken) { + var urlObject = URL.parse(url); + + if (urlObject.protocol !== 'mapbox:') { + return url; + } else { + return normalizeURL( + 'mapbox:/' + urlObject.pathname + formatQuery(urlObject.query), + '/styles/v1/', + accessToken + ); } - - var parsedURL = urlObject.protocol + '/' + urlObject.pathname + formattedQuery; - - return normalizeURL(parsedURL, '/styles/v1/', accessToken); }; -module.exports.normalizeSourceURL = function(sourceURL, accessToken) { - var sourceURLJson = sourceURL + '.json'; - - var urlObject = url.parse(sourceURLJson); - - if (urlObject.protocol !== 'mapbox:') - return sourceURL; - - urlObject.pathname = urlObject.hostname; +module.exports.normalizeSourceURL = function(url, accessToken) { + var urlObject = URL.parse(url); + + if (urlObject.protocol !== 'mapbox:') { + return url; + } else { + // TileJSON requests need a secure flag appended to their URLs so + // that the server knows to send SSL-ified resource references. + return normalizeURL( + 'mapbox://' + urlObject.hostname + '.json', + '/v4/', + accessToken + ) + '&secure'; + } - var parsedURL = urlObject.protocol + '//' + urlObject.pathname; - // TileJSON requests need a secure flag appended to their URLs so - // that the server knows to send SSL-ified resource references. - return normalizeURL(parsedURL, '/v4/', accessToken) + '&secure'; }; -module.exports.normalizeGlyphsURL = function(glyphsURL, accessToken) { - var urlObject = url.parse(glyphsURL); - - if (urlObject.protocol !== 'mapbox:') - return glyphsURL; - - var splitAlongQueryURL = glyphsURL.split('?'); - var user = splitAlongQueryURL[0].split('/')[3]; - var queryString = splitAlongQueryURL[1] ? '?' + splitAlongQueryURL[1] : ''; - - return normalizeURL('mapbox://' + user + '/{fontstack}/{range}.pbf' + queryString, '/fonts/v1/', accessToken); +module.exports.normalizeGlyphsURL = function(url, accessToken) { + var urlObject = URL.parse(url); + + if (urlObject.protocol !== 'mapbox:') { + return url; + } else { + var user = urlObject.pathname.split('/')[1]; + return normalizeURL( + 'mapbox://' + user + '/{fontstack}/{range}.pbf' + formatQuery(urlObject.query), + '/fonts/v1/', + accessToken + ); + } }; -module.exports.normalizeSpriteURL = function(spriteURL, format, ext, accessToken) { - var urlObject = url.parse(spriteURL, true); - - if (urlObject.protocol !== 'mapbox:') - return spriteURL + format + ext; - - var formattedQuery = ''; - - urlObject.pathname = urlObject.pathname + '/sprite' + format + ext; - - if (Object.keys(urlObject.query).length !== 0) { - formattedQuery = '?' + querystring.stringify(urlObject.query); +module.exports.normalizeSpriteURL = function(url, format, extension, accessToken) { + var urlObject = URL.parse(url); + + if (urlObject.protocol !== 'mapbox:') { + return url + format + extension; + } else { + return normalizeURL( + 'mapbox:/' + urlObject.pathname + '/sprite' + format + extension + formatQuery(urlObject.query), + '/styles/v1/', + accessToken + ); } - - var parsedURL = urlObject.protocol + '/' + urlObject.pathname + formattedQuery; - - return normalizeURL(parsedURL, '/styles/v1/', accessToken); }; module.exports.normalizeTileURL = function(tileURL, sourceURL, tileSize) { - if (!sourceURL || !sourceURL.match(/^mapbox:\/\//)) - return tileURL; + var tileURLObject = URL.parse(tileURL, true); + if (!sourceURL) return tileURL; + var sourceURLObject = URL.parse(sourceURL); + if (sourceURLObject.protocol !== 'mapbox:') return tileURL; // The v4 mapbox tile API supports 512x512 image tiles only when @2x // is appended to the tile URL. If `tileSize: 512` is specified for // a Mapbox raster source force the @2x suffix even if a non hidpi // device. - var httpsURL = tileURL.replace(/([?&]access_token=)tk\.[^&]+/, '$1' + config.ACCESS_TOKEN); - var extension = browser.supportsWebp ? 'webp' : '$1'; - return httpsURL.replace(/\.((?:png|jpg)\d*)(?=$|\?)/, browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x.' + extension : '.' + extension); + + var extension = browser.supportsWebp ? '.webp' : '$1'; + if (browser.devicePixelRatio >= 2 || tileSize === 512) extension = '@2x' + extension; + + return URL.format({ + protocol: tileURLObject.protocol, + hostname: tileURLObject.hostname, + pathname: tileURLObject.pathname.replace(/(\.(?:png|jpg)\d*)/, extension), + query: replaceTempAccessToken(tileURLObject.query) + }); }; + +function formatQuery(query) { + return (query ? '?' + query : ''); +} + +function replaceTempAccessToken(query) { + if (query.access_token && query.access_token.slice(0, 3) === 'tk.') { + return util.extend({}, query, { + 'access_token': config.ACCESS_TOKEN + }); + } else { + return query; + } +}