mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
76 lines
2.8 KiB
JavaScript
76 lines
2.8 KiB
JavaScript
var URLHelper = {
|
|
|
|
// build an absolute URL from a relative one using the provided baseURL
|
|
// if relativeURL is an absolute URL it will be returned as is.
|
|
buildAbsoluteURL: function(baseURL, relativeURL) {
|
|
// remove any remaining space and CRLF
|
|
relativeURL = relativeURL.trim();
|
|
if (/^[a-z]+:/i.test(relativeURL)) {
|
|
// complete url, not relative
|
|
return relativeURL;
|
|
}
|
|
|
|
var relativeURLQuery = null;
|
|
var relativeURLHash = null;
|
|
|
|
var relativeURLHashSplit = /^([^#]*)(.*)$/.exec(relativeURL);
|
|
if (relativeURLHashSplit) {
|
|
relativeURLHash = relativeURLHashSplit[2];
|
|
relativeURL = relativeURLHashSplit[1];
|
|
}
|
|
var relativeURLQuerySplit = /^([^\?]*)(.*)$/.exec(relativeURL);
|
|
if (relativeURLQuerySplit) {
|
|
relativeURLQuery = relativeURLQuerySplit[2];
|
|
relativeURL = relativeURLQuerySplit[1];
|
|
}
|
|
|
|
var baseURLHashSplit = /^([^#]*)(.*)$/.exec(baseURL);
|
|
if (baseURLHashSplit) {
|
|
baseURL = baseURLHashSplit[1];
|
|
}
|
|
var baseURLQuerySplit = /^([^\?]*)(.*)$/.exec(baseURL);
|
|
if (baseURLQuerySplit) {
|
|
baseURL = baseURLQuerySplit[1];
|
|
}
|
|
|
|
var baseURLDomainSplit = /^((([a-z]+):)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?\/)(.*)$/i.exec(baseURL);
|
|
var baseURLProtocol = baseURLDomainSplit[3];
|
|
var baseURLDomain = baseURLDomainSplit[1];
|
|
var baseURLPath = baseURLDomainSplit[5];
|
|
|
|
var builtURL = null;
|
|
if (/^\/\//.test(relativeURL)) {
|
|
builtURL = baseURLProtocol+'://'+URLHelper.buildAbsolutePath('', relativeURL.substring(2));
|
|
}
|
|
else if (/^\//.test(relativeURL)) {
|
|
builtURL = baseURLDomain+URLHelper.buildAbsolutePath('', relativeURL.substring(1));
|
|
}
|
|
else {
|
|
builtURL = URLHelper.buildAbsolutePath(baseURLDomain+baseURLPath, relativeURL);
|
|
}
|
|
|
|
// put the query and hash parts back
|
|
if (relativeURLQuery) {
|
|
builtURL += relativeURLQuery;
|
|
}
|
|
if (relativeURLHash) {
|
|
builtURL += relativeURLHash;
|
|
}
|
|
return builtURL;
|
|
},
|
|
|
|
// build an absolute path using the provided basePath
|
|
// adapted from https://developer.mozilla.org/en-US/docs/Web/API/document/cookie#Using_relative_URLs_in_the_path_parameter
|
|
// this does not handle the case where relativePath is "/" or "//". These cases should be handled outside this.
|
|
buildAbsolutePath: function(basePath, relativePath) {
|
|
var sRelPath = relativePath;
|
|
var nUpLn, sDir = '', sPath = basePath.replace(/[^\/]*$/, sRelPath.replace(/(\/|^)(?:\.?\/+)+/g, '$1'));
|
|
for (var nEnd, nStart = 0; nEnd = sPath.indexOf('/../', nStart), nEnd > -1; nStart = nEnd + nUpLn) {
|
|
nUpLn = /^\/(?:\.\.\/)*/.exec(sPath.slice(nEnd))[0].length;
|
|
sDir = (sDir + sPath.substring(nStart, nEnd)).replace(new RegExp('(?:\\\/+[^\\\/]*){0,' + ((nUpLn - 1) / 3) + '}$'), '/');
|
|
}
|
|
return sDir + sPath.substr(nStart);
|
|
}
|
|
};
|
|
|
|
module.exports = URLHelper;
|