|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var parseuri = require('parseuri');
|
|
var debug = require('debug')('socket.io-client:url');
|
|
|
|
/**
|
|
* Module exports.
|
|
*/
|
|
|
|
module.exports = url;
|
|
|
|
/**
|
|
* URL parser.
|
|
*
|
|
* @param {String} url
|
|
* @param {Object} An object meant to mimic window.location.
|
|
* Defaults to window.location.
|
|
* @api public
|
|
*/
|
|
|
|
function url(uri, loc){
|
|
var obj = uri;
|
|
|
|
// default to window.location
|
|
var loc = loc || global.location;
|
|
if (null == uri) uri = loc.protocol + '//' + loc.hostname;
|
|
|
|
// relative path support
|
|
if ('string' == typeof uri) {
|
|
if ('/' == uri.charAt(0)) {
|
|
if ('/' == uri.charAt(1)) {
|
|
uri = loc.protocol + uri;
|
|
} else {
|
|
uri = loc.hostname + uri;
|
|
}
|
|
}
|
|
|
|
if (!/^(https?|wss?):\/\//.test(uri)) {
|
|
debug('protocol-less url %s', uri);
|
|
if ('undefined' != typeof loc) {
|
|
uri = loc.protocol + '//' + uri;
|
|
} else {
|
|
uri = 'https://' + uri;
|
|
}
|
|
}
|
|
|
|
// parse
|
|
debug('parse %s', uri);
|
|
obj = parseuri(uri);
|
|
}
|
|
|
|
// make sure we treat `localhost:80` and `localhost` equally
|
|
if (!obj.port) {
|
|
if (/^(http|ws)$/.test(obj.protocol)) {
|
|
obj.port = '80';
|
|
}
|
|
else if (/^(http|ws)s$/.test(obj.protocol)) {
|
|
obj.port = '443';
|
|
}
|
|
}
|
|
|
|
obj.path = obj.path || '/';
|
|
|
|
// define unique id
|
|
obj.id = obj.protocol + '://' + obj.host + ':' + obj.port;
|
|
// define href
|
|
obj.href = obj.protocol + '://' + obj.host + (loc && loc.port == obj.port ? '' : (':' + obj.port));
|
|
|
|
return obj;
|
|
}
|