Skip to content

Commit

Permalink
BREAKING CHANGE: Handle non-trailing slashes correctly (#1512)
Browse files Browse the repository at this point in the history
* router - remove do not merge double slashes by default
* use server.pre(restify.plugins.pre.dedupeSlashes()) to deal with double slashes
* refactor test to cover multiple slashes cases
  • Loading branch information
hekike authored and William Blankenship committed Oct 9, 2017
1 parent e8efd6c commit ac1eec5
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 39 deletions.
4 changes: 2 additions & 2 deletions lib/router.js
Expand Up @@ -103,7 +103,7 @@ function compileURL(options) {
return (false);
}

pattern += '\\/+';
pattern += '\\/';

if (frag.charAt(0) === ':') {
var label = frag;
Expand Down Expand Up @@ -134,7 +134,7 @@ function compileURL(options) {
}

if (!options.strict) {
pattern += '[\\/]*';
pattern += '[\\/]?';
}

if (pattern === '^') {
Expand Down
29 changes: 4 additions & 25 deletions test/plugins/dedupeSlashes.js
Expand Up @@ -67,18 +67,8 @@ describe('dedupe forward slashes in URL', function () {
});
});

it('should remove duplicate slashes', function (done) {
CLIENT.get('//foo//bar', function (err, _, res, data) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(data, '/foo/bar');
done();
});
});

it('should remove duplicate slashes including trailing slashes',
function (done) {
CLIENT.get('//foo//bar//', function (err, _, res, data) {
it('should merge multiple slashes', function (done) {
CLIENT.get('//////foo///bar///////', function (err, _, res, data) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(data, '/foo/bar/');
Expand Down Expand Up @@ -131,19 +121,8 @@ describe('dedupe forward slashes in URL', function () {
});
});

it('should remove duplicate slashes', function (done) {
CLIENT.get('//foo//bar//', function (err, _, res, data) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(data, '/foo/bar/');
done();
});
});


it('should remove duplicate slashes including trailing slashes',
function (done) {
CLIENT.get('//foo//bar//', function (err, _, res, data) {
it('should merge multiple slashes', function (done) {
CLIENT.get('//////foo///bar///////', function (err, _, res, data) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(data, '/foo/bar/');
Expand Down
38 changes: 26 additions & 12 deletions test/router.test.js
Expand Up @@ -189,34 +189,48 @@ test('Strict routing distinguishes trailing slash', function (t) {
server.get('/trailing/', noop);
server.get('/no-trailing', noop);


var trailing = server.router.routes.GET[0];
t.ok(trailing.path.test('/trailing/'));
t.notOk(trailing.path.test('/trailing'));
t.ok(trailing.path.test('/trailing/'), 'Single trailing slash is ok');
t.notOk(trailing.path.test('/trailing'), 'No trailing slash is not ok');
t.notOk(trailing.path.test('/trailing//'),
'Double trailing slash is not ok');
t.notOk(trailing.path.test('//trailing/'),
'Double heading slash is not ok');

var noTrailing = server.router.routes.GET[1];
t.ok(noTrailing.path.test('/no-trailing'));
t.notOk(noTrailing.path.test('/no-trailing/'));
t.ok(noTrailing.path.test('/no-trailing', 'No trailing slash is ok'));
t.notOk(noTrailing.path.test('/no-trailing/'),
'Single trailing slash is not ok');
t.notOk(noTrailing.path.test('/no-trailing//'),
'Double trailing slash is not ok');
t.notOk(noTrailing.path.test('//no-trailing'),
'Double heading slash is not ok');

t.end();
});

test('Default non-strict routing ignores trailing slash(es)', function (t) {
test('Non-strict routing distinguishes trailing slash', function (t) {
var server = restify.createServer();
function noop () {}

server.get('/trailing/', noop);
server.get('/no-trailing', noop);

var trailing = server.router.routes.GET[0];
t.ok(trailing.path.test('/trailing/'));
t.ok(trailing.path.test('//trailing//'));
t.ok(trailing.path.test('/trailing'));
t.ok(trailing.path.test('/trailing/', 'Single trailing slash is ok'));
t.ok(trailing.path.test('/trailing'), 'No trailing slash is not ok');
t.notOk(trailing.path.test('/trailing//'),
'Double trailing slash is not ok');
t.notOk(trailing.path.test('//trailing'),
'Double heading slash is not ok');

var noTrailing = server.router.routes.GET[1];
t.ok(noTrailing.path.test('/no-trailing'));
t.ok(noTrailing.path.test('//no-trailing//'));
t.ok(noTrailing.path.test('/no-trailing/'));
t.ok(noTrailing.path.test('/no-trailing', 'No trailing slash is ok'));
t.ok(noTrailing.path.test('/no-trailing/'), 'Single trailing slash is ok');
t.notOk(noTrailing.path.test('/no-trailing//'),
'Double trailing slash is not ok');
t.notOk(noTrailing.path.test('//no-trailing'),
'Double heading slash is not ok');

t.end();
});
Expand Down

0 comments on commit ac1eec5

Please sign in to comment.