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