Skip to content
This repository was archived by the owner on Jul 13, 2020. It is now read-only.

Commit 5c23a11

Browse files
committed
url resolution tweaks
1 parent 663b3e9 commit 5c23a11

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

Diff for: core/resolve.js

+18-19
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import { isNode } from './common.js';
66
function throwResolveError (relUrl, parentUrl) {
77
throw new RangeError('Unable to resolve "' + relUrl + '" to ' + parentUrl);
88
}
9-
var protocolRegEx = /^[^/]+:/;
109
export function resolveIfNotPlain (relUrl, parentUrl) {
1110
relUrl = relUrl.trim();
12-
if (parentUrl)
13-
var parentProtocol = parentUrl.match(protocolRegEx);
11+
var parentProtocol = parentUrl && parentUrl.substr(0, parentUrl.indexOf(':') + 1);
1412

1513
var firstChar = relUrl[0];
1614
var secondChar = relUrl[1];
@@ -19,12 +17,13 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
1917
if (firstChar === '/' && secondChar === '/') {
2018
if (!parentProtocol)
2119
throwResolveError(relUrl, parentUrl);
22-
return parentProtocol[0] + relUrl;
20+
return parentProtocol + relUrl;
2321
}
2422
// relative-url
25-
else if (firstChar === '.' && (secondChar === '/' || secondChar === '.' && (relUrl[2] === '/' || relUrl.length === 2) || relUrl.length === 1)
26-
|| firstChar === '/') {
27-
var parentIsPlain = !parentProtocol || parentUrl[parentProtocol[0].length] !== '/';
23+
else if (firstChar === '.' && (secondChar === '/' || secondChar === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
24+
relUrl.length === 1 && (relUrl += '/')) ||
25+
firstChar === '/') {
26+
var parentIsPlain = !parentProtocol || parentUrl[parentProtocol.length] !== '/';
2827

2928
// read pathname from parent if a URL
3029
// pathname taken to be part after leading "/"
@@ -35,10 +34,10 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
3534
throwResolveError(relUrl, parentUrl);
3635
pathname = parentUrl;
3736
}
38-
else if (parentUrl[parentProtocol[0].length + 1] === '/') {
37+
else if (parentUrl[parentProtocol.length + 1] === '/') {
3938
// resolving to a :// so we need to read out the auth and host
40-
if (parentProtocol[0] !== 'file:') {
41-
pathname = parentUrl.substr(parentProtocol[0].length + 2);
39+
if (parentProtocol !== 'file:') {
40+
pathname = parentUrl.substr(parentProtocol.length + 2);
4241
pathname = pathname.substr(pathname.indexOf('/') + 1);
4342
}
4443
else {
@@ -47,7 +46,7 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
4746
}
4847
else {
4948
// resolving to :/ so pathname is the /... part
50-
pathname = parentUrl.substr(parentProtocol[0].length + 1);
49+
pathname = parentUrl.substr(parentProtocol.length + 1);
5150
}
5251

5352
if (firstChar === '/') {
@@ -63,27 +62,27 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
6362
var segmented = pathname.substr(0, pathname.lastIndexOf('/') + 1) + relUrl;
6463

6564
var output = [];
66-
var segmentIndex = undefined;
65+
var segmentIndex = -1;
6766

6867
for (var i = 0; i < segmented.length; i++) {
6968
// busy reading a segment - only terminate on '/'
70-
if (segmentIndex !== undefined) {
69+
if (segmentIndex !== -1) {
7170
if (segmented[i] === '/') {
72-
output.push(segmented.substr(segmentIndex, i - segmentIndex + 1));
73-
segmentIndex = undefined;
71+
output.push(segmented.substring(segmentIndex, i + 1));
72+
segmentIndex = -1;
7473
}
7574
continue;
7675
}
7776

7877
// new segment - check if it is relative
7978
if (segmented[i] === '.') {
8079
// ../ segment
81-
if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i === segmented.length - 2)) {
80+
if (segmented[i + 1] === '.' && segmented[i + 2] === '/') {
8281
output.pop();
8382
i += 2;
8483
}
8584
// ./ segment
86-
else if (segmented[i + 1] === '/' || i === segmented.length - 1) {
85+
else if (segmented[i + 1] === '/') {
8786
i += 1;
8887
}
8988
else {
@@ -106,8 +105,8 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
106105
segmentIndex = i;
107106
}
108107
// finish reading out the last segment
109-
if (segmentIndex !== undefined)
110-
output.push(segmented.substr(segmentIndex, segmented.length - segmentIndex));
108+
if (segmentIndex !== -1)
109+
output.push(segmented.substr(segmentIndex));
111110

112111
return parentUrl.substr(0, parentUrl.length - pathname.length) + output.join('');
113112
}

Diff for: test/1-url-resolution.js

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ describe('Simple normalization tests', function() {
55
it('Should trim whitespace from URLs', function () {
66
assert.equal(resolveIfNotPlain(' c:\\some\\path ', 'file:///c:/adsf/asdf'), 'file:///c:/some/path');
77
});
8+
it('Should resolve relative with protocol', function () {
9+
assert.equal(resolveIfNotPlain('./x:y', 'https://x.com/y'), 'https://x.com/x:y');
10+
});
811
it('Should resolve windows paths as file:/// URLs', function() {
912
assert.equal(resolveIfNotPlain('c:\\some\\path', 'file:///c:/adsf/asdf'), 'file:///c:/some/path');
1013
});

0 commit comments

Comments
 (0)