Skip to content

Commit 2084f52

Browse files
bnoordhuisFishrock123
authored andcommitted
test: test more http response splitting scenarios
The test verified the output of http.OutgoingMessage#writeHead() but not http.OutgoingMessage#setHeader(). Also check the response body. PR-URL: #2945 Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com> Reviewed-By: Rod Vagg <r@va.gg>
1 parent fa08d1d commit 2084f52

File tree

1 file changed

+52
-21
lines changed

1 file changed

+52
-21
lines changed

test/parallel/test-http-header-response-splitting.js

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,75 @@ var common = require('../common'),
33
assert = require('assert'),
44
http = require('http');
55

6-
var testIndex = 0,
7-
responses = 0;
6+
var testIndex = 0;
7+
const testCount = 4 * 6;
8+
const responseBody = 'Hi mars!';
89

910
var server = http.createServer(function(req, res) {
10-
switch (testIndex++) {
11+
function reply(header) {
12+
switch (testIndex % 4) {
1113
case 0:
12-
res.writeHead(200, { test: 'foo \r\ninvalid: bar' });
14+
res.writeHead(200, { a: header, b: header });
1315
break;
1416
case 1:
15-
res.writeHead(200, { test: 'foo \ninvalid: bar' });
17+
res.setHeader('a', header);
18+
res.setHeader('b', header);
19+
res.writeHead(200);
1620
break;
1721
case 2:
18-
res.writeHead(200, { test: 'foo \rinvalid: bar' });
22+
res.setHeader('a', header);
23+
res.writeHead(200, { b: header });
1924
break;
2025
case 3:
21-
res.writeHead(200, { test: 'foo \n\n\ninvalid: bar' });
26+
res.setHeader('a', [header]);
27+
res.writeHead(200, { b: header });
28+
break;
29+
default:
30+
assert.fail('unreachable');
31+
}
32+
res.end(responseBody);
33+
}
34+
switch ((testIndex / 4) | 0) {
35+
case 0:
36+
reply('foo \r\ninvalid: bar');
37+
break;
38+
case 1:
39+
reply('foo \ninvalid: bar');
40+
break;
41+
case 2:
42+
reply('foo \rinvalid: bar');
43+
break;
44+
case 3:
45+
reply('foo \n\n\ninvalid: bar');
2246
break;
2347
case 4:
24-
res.writeHead(200, { test: 'foo \r\n \r\n \r\ninvalid: bar' });
25-
server.close();
48+
reply('foo \r\n \r\n \r\ninvalid: bar');
49+
break;
50+
case 5:
51+
reply('foo \r \n \r \n \r \ninvalid: bar');
2652
break;
2753
default:
2854
assert(false);
2955
}
30-
res.end('Hi mars!');
56+
if (++testIndex === testCount) {
57+
server.close();
58+
}
3159
});
3260

33-
server.listen(common.PORT, function() {
34-
for (var i = 0; i < 5; i++) {
35-
var req = http.get({ port: common.PORT, path: '/' }, function(res) {
36-
assert.strictEqual(res.headers.test, 'foo invalid: bar');
61+
server.listen(common.PORT, common.mustCall(function() {
62+
for (var i = 0; i < testCount; i++) {
63+
http.get({ port: common.PORT, path: '/' }, common.mustCall(function(res) {
64+
assert.strictEqual(res.headers.a, 'foo invalid: bar');
65+
assert.strictEqual(res.headers.b, 'foo invalid: bar');
66+
assert.strictEqual(res.headers.foo, undefined);
3767
assert.strictEqual(res.headers.invalid, undefined);
38-
responses++;
68+
var data = '';
69+
res.setEncoding('utf8');
70+
res.on('data', function(s) { data += s; });
71+
res.on('end', common.mustCall(function() {
72+
assert.equal(data, responseBody);
73+
}));
3974
res.resume();
40-
});
75+
}));
4176
}
42-
});
43-
44-
process.on('exit', function() {
45-
assert.strictEqual(responses, 5);
46-
});
77+
}));

0 commit comments

Comments
 (0)