Skip to content
This repository was archived by the owner on Aug 10, 2023. It is now read-only.

Commit e3016b5

Browse files
committed
Merge pull request #36 from restify/dedupe
GH-35: new dedupeSlashes plugin
2 parents 3509eaa + 45233aa commit e3016b5

4 files changed

Lines changed: 172 additions & 2 deletions

File tree

lib/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module.exports = {
2626
pre: {
2727
pause: require('./pre/pause'),
2828
sanitizePath: require('./pre/prePath'),
29-
userAgentConnection: require('./pre/userAgent')
29+
userAgentConnection: require('./pre/userAgent'),
30+
dedupeSlashes: require('./pre/dedupeSlashes')
3031
}
3132
};

lib/pre/dedupeSlashes.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
'use strict';
2+
3+
4+
function createDedupeSlashes() {
5+
return function dedupeSlashes(req, res, next) {
6+
req.url = req.url.replace(/(\/)\/+/g, '$1');
7+
return next();
8+
};
9+
}
10+
11+
12+
module.exports = createDedupeSlashes;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
"mkdirp": "^0.5.1",
9090
"mocha": "^2.5.3",
9191
"nsp": "^2.4.0",
92-
"restify": "^4.0.3",
92+
"restify": "git+https://git@github.com/restify/node-restify.git#5.x",
9393
"restify-clients": "^1.1.1",
9494
"rimraf": "^2.4.3"
9595
},

test/dedupeSlashes.js

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
'use strict';
2+
3+
// external requires
4+
var assert = require('chai').assert;
5+
var restify = require('restify');
6+
var restifyClients = require('restify-clients');
7+
8+
// local files
9+
var helper = require('./lib/helper');
10+
var plugins = require('../lib');
11+
12+
// local globals
13+
var SERVER;
14+
var CLIENT;
15+
var PORT;
16+
17+
18+
describe('dedupe forward slashes in URL', function () {
19+
20+
describe('non-strict routing', function () {
21+
22+
before(function (done) {
23+
SERVER = restify.createServer({
24+
dtrace: helper.dtrace,
25+
log: helper.getLog('server')
26+
});
27+
28+
SERVER.pre(plugins.pre.dedupeSlashes());
29+
30+
SERVER.get('/foo/bar', function respond(req, res, next) {
31+
res.send(req.url);
32+
next();
33+
});
34+
35+
SERVER.listen(0, '127.0.0.1', function () {
36+
PORT = SERVER.address().port;
37+
CLIENT = restifyClients.createJsonClient({
38+
url: 'http://127.0.0.1:' + PORT,
39+
dtrace: helper.dtrace,
40+
retry: false
41+
});
42+
43+
done();
44+
});
45+
});
46+
47+
after(function (done) {
48+
CLIENT.close();
49+
SERVER.close(done);
50+
});
51+
52+
it('should not remove single slashes', function (done) {
53+
CLIENT.get('/foo/bar', function (err, _, res, data) {
54+
assert.ifError(err);
55+
assert.equal(res.statusCode, 200);
56+
assert.equal(data, '/foo/bar');
57+
done();
58+
});
59+
});
60+
61+
it('should not remove single slashes including trailing slashes',
62+
function (done) {
63+
CLIENT.get('/foo/bar/', function (err, _, res, data) {
64+
assert.ifError(err);
65+
assert.equal(res.statusCode, 200);
66+
assert.equal(data, '/foo/bar/');
67+
done();
68+
});
69+
});
70+
71+
it('should remove duplicate slashes', function (done) {
72+
CLIENT.get('//foo//bar', function (err, _, res, data) {
73+
assert.ifError(err);
74+
assert.equal(res.statusCode, 200);
75+
assert.equal(data, '/foo/bar');
76+
done();
77+
});
78+
});
79+
80+
it('should remove duplicate slashes including trailing slashes',
81+
function (done) {
82+
CLIENT.get('//foo//bar//', function (err, _, res, data) {
83+
assert.ifError(err);
84+
assert.equal(res.statusCode, 200);
85+
assert.equal(data, '/foo/bar/');
86+
done();
87+
});
88+
});
89+
});
90+
91+
92+
93+
describe('strict routing', function () {
94+
95+
before(function (done) {
96+
SERVER = restify.createServer({
97+
strictRouting: true,
98+
dtrace: helper.dtrace,
99+
log: helper.getLog('server')
100+
});
101+
102+
SERVER.pre(plugins.pre.dedupeSlashes());
103+
104+
SERVER.get('/foo/bar/', function respond(req, res, next) {
105+
res.send(req.url);
106+
next();
107+
});
108+
109+
SERVER.listen(0, '127.0.0.1', function () {
110+
PORT = SERVER.address().port;
111+
CLIENT = restifyClients.createJsonClient({
112+
url: 'http://127.0.0.1:' + PORT,
113+
dtrace: helper.dtrace,
114+
retry: false
115+
});
116+
117+
done();
118+
});
119+
});
120+
121+
after(function (done) {
122+
CLIENT.close();
123+
SERVER.close(done);
124+
});
125+
126+
it('should not remove single slashes', function (done) {
127+
CLIENT.get('/foo/bar/', function (err, _, res, data) {
128+
assert.ifError(err);
129+
assert.equal(res.statusCode, 200);
130+
assert.equal(data, '/foo/bar/');
131+
done();
132+
});
133+
});
134+
135+
it('should remove duplicate slashes', function (done) {
136+
CLIENT.get('//foo//bar//', function (err, _, res, data) {
137+
assert.ifError(err);
138+
assert.equal(res.statusCode, 200);
139+
assert.equal(data, '/foo/bar/');
140+
done();
141+
});
142+
});
143+
144+
145+
it('should remove duplicate slashes including trailing slashes',
146+
function (done) {
147+
CLIENT.get('//foo//bar//', function (err, _, res, data) {
148+
assert.ifError(err);
149+
assert.equal(res.statusCode, 200);
150+
assert.equal(data, '/foo/bar/');
151+
done();
152+
});
153+
});
154+
});
155+
});
156+
157+

0 commit comments

Comments
 (0)