Skip to content

Commit 2d9ac2c

Browse files
authored
[fix] Sanitize only special URLs (#209)
Fixes #208 (comment).
1 parent fb128af commit 2d9ac2c

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

index.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ function trimLeft(str) {
3232
var rules = [
3333
['#', 'hash'], // Extract from the back.
3434
['?', 'query'], // Extract from the back.
35-
function sanitize(address) { // Sanitize what is left of the address
36-
return address.replace(/\\/g, '/');
35+
function sanitize(address, url) { // Sanitize what is left of the address
36+
return isSpecial(url.protocol) ? address.replace(/\\/g, '/') : address;
3737
},
3838
['/', 'pathname'], // Extract from the back.
3939
['@', 'auth', 1], // Extract from the front.
@@ -170,7 +170,7 @@ function extractProtocol(address, location) {
170170
if (forwardSlashes) {
171171
rest = rest.slice(2);
172172
}
173-
} else if (slashesCount >= 2 && location.hostname) {
173+
} else if (slashesCount >= 2 && isSpecial(location.protocol)) {
174174
rest = match[4];
175175
}
176176

@@ -280,7 +280,10 @@ function Url(address, location, parser) {
280280
//
281281
if (
282282
url.protocol === 'file:' ||
283-
(extracted.slashesCount < 2 && !isSpecial(extracted.protocol))
283+
(!extracted.slashes &&
284+
(extracted.protocol ||
285+
extracted.slashesCount < 2 ||
286+
!isSpecial(url.protocol)))
284287
) {
285288
instructions[3] = [/(.*)/, 'pathname'];
286289
}
@@ -289,7 +292,7 @@ function Url(address, location, parser) {
289292
instruction = instructions[i];
290293

291294
if (typeof instruction === 'function') {
292-
address = instruction(address);
295+
address = instruction(address, url);
293296
continue;
294297
}
295298

test/test.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -358,20 +358,48 @@ describe('url-parse', function () {
358358
assume(parsed.href).equals('foo:/example.com');
359359
assume(parsed.slashes).is.false();
360360

361+
url = 'foo:\\example.com';
362+
parsed = parse(url);
363+
assume(parsed.hostname).equals('');
364+
assume(parsed.pathname).equals('\\example.com');
365+
assume(parsed.href).equals('foo:\\example.com');
366+
assume(parsed.slashes).is.false();
367+
361368
url = 'foo://example.com';
362369
parsed = parse(url);
363370
assume(parsed.hostname).equals('example.com');
364371
assume(parsed.pathname).equals('');
365372
assume(parsed.href).equals('foo://example.com');
366373
assume(parsed.slashes).is.true();
367374

375+
url = 'foo:\\\\example.com';
376+
parsed = parse(url);
377+
assume(parsed.hostname).equals('');
378+
assume(parsed.pathname).equals('\\\\example.com');
379+
assume(parsed.href).equals('foo:\\\\example.com');
380+
assume(parsed.slashes).is.false();
381+
368382
url = 'foo:///example.com';
369383
parsed = parse(url);
370384
assume(parsed.hostname).equals('');
371385
assume(parsed.pathname).equals('/example.com');
372386
assume(parsed.href).equals('foo:///example.com');
373387
assume(parsed.slashes).is.true();
374-
})
388+
389+
url = 'foo:\\\\\\example.com';
390+
parsed = parse(url);
391+
assume(parsed.hostname).equals('');
392+
assume(parsed.pathname).equals('\\\\\\example.com');
393+
assume(parsed.href).equals('foo:\\\\\\example.com');
394+
assume(parsed.slashes).is.false();
395+
396+
url = '\\\\example.com/foo/bar';
397+
parsed = parse(url, 'foo://bar.com');
398+
assume(parsed.hostname).equals('bar.com');
399+
assume(parsed.pathname).equals('/\\\\example.com/foo/bar');
400+
assume(parsed.href).equals('foo://bar.com/\\\\example.com/foo/bar');
401+
assume(parsed.slashes).is.true();
402+
});
375403

376404
describe('origin', function () {
377405
it('generates an origin property', function () {

0 commit comments

Comments
 (0)