diff --git a/src/ng/urlUtils.js b/src/ng/urlUtils.js index f6c72ee6aba4..997b1b1ec794 100644 --- a/src/ng/urlUtils.js +++ b/src/ng/urlUtils.js @@ -4,11 +4,11 @@ // https://tools.ietf.org/html/rfc3986#appendix-A var sub_delims = '!$&\'()*+,;='; var alpha = 'abcdefghijklmnopqrstuvwxyz'; -var digit = '0123456789' +var digit = '0123456789'; var unreserved = alpha + digit + '-._~'; -var pchar = unreserved + sub_delims + ':' + '@'; //pct-encoded excluded -var query = (pchar + '/' + '?').replace(/[&=]/g, ''); //&= excluded -var fragment = pchar + '/' + '?'; +var pchar = unreserved + sub_delims + ':@'; //pct-encoded excluded +var query = (pchar + '/?').replace(/[&=]/g, ''); //&= excluded +var fragment = pchar + '/?'; // Map of the encoded version of all characters not requiring encoding var PATH_NON_ENCODED = charsToEncodedMap(pchar); @@ -126,9 +126,15 @@ function urlResolve(url) { // No browser normalizes all of the optionally encoded characters consistently. // Various browsers normalize a subsets of the unreserved characters within the // path, search and hash portions of the URL. - urlParsingNode.pathname = normalizeUriPath(urlParsingNode.pathname); - urlParsingNode.search = normalizeUriQuery(urlParsingNode.search.replace(/^\?/, '')); - urlParsingNode.hash = normalizeUriFragment(urlParsingNode.hash.replace(/^\#/, '')); + if (urlParsingNode.pathname) { + urlParsingNode.pathname = normalizeUriPath(urlParsingNode.pathname); + } + if (urlParsingNode.search) { + urlParsingNode.search = normalizeUriQuery(urlParsingNode.search.replace(/^\?/, '')); + } + if (urlParsingNode.hash) { + urlParsingNode.hash = normalizeUriFragment(urlParsingNode.hash.replace(/^#/, '')); + } return { href: urlParsingNode.href,