|
|
/** * 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; }
|