diff --git a/src/util/mapbox.js b/src/util/mapbox.js index de4201a0aef..651f00f0c21 100644 --- a/src/util/mapbox.js +++ b/src/util/mapbox.js @@ -103,10 +103,14 @@ export class RequestManager { } normalizeSpriteURL(url: string, format: string, extension: string, accessToken?: string): string { - const urlObject = parseUrl(url); + const urlObject = parseUrl2(url); if (!isMapboxURL(url)) { - urlObject.path += `${format}${extension}`; - return formatUrl(urlObject); + if (urlObject.protocol === undefined) { + return `${url}${format}${extension}`; + } else { + urlObject.path += `${format}${extension}`; + return formatUrl(urlObject); + } } urlObject.path = `/styles/v1${urlObject.path}/sprite${format}${extension}`; return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); @@ -257,6 +261,21 @@ function parseUrl(url: string): UrlObject { }; } +const urlRe2 = /^((\w+):\/\/)?([^/?]*)(\/[^?]+)?\??(.+)?/; + +function parseUrl2(url: string): UrlObject { + const parts = url.match(urlRe2); + if (!parts) { + throw new Error('Unable to parse URL object'); + } + return { + protocol: parts[2], + authority: parts[3], + path: parts[4] || '/', + params: parts[5] ? parts[5].split('&') : [] + }; +} + function formatUrl(obj: UrlObject): string { const params = obj.params.length ? `?${obj.params.join('&')}` : ''; return `${obj.protocol}://${obj.authority}${obj.path}${params}`;