123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
-
- /**
- * 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 || (typeof location !== 'undefined' && 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;
- }
|