You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.6 KiB
75 lines
1.6 KiB
|
|
/** |
|
* 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 |
|
loc = loc || global.location; |
|
if (null == uri) uri = loc.protocol + '//' + loc.host; |
|
|
|
// relative path support |
|
if ('string' === typeof uri) { |
|
if ('/' === uri.charAt(0)) { |
|
if ('/' === uri.charAt(1)) { |
|
uri = loc.protocol + uri; |
|
} else { |
|
uri = loc.host + 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 || '/'; |
|
|
|
var ipv6 = obj.host.indexOf(':') !== -1; |
|
var host = ipv6 ? '[' + obj.host + ']' : obj.host; |
|
|
|
// define unique id |
|
obj.id = obj.protocol + '://' + host + ':' + obj.port; |
|
// define href |
|
obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port)); |
|
|
|
return obj; |
|
}
|
|
|