Browse Source

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: https://github.com/nodejs/node/pull/2945
Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Reviewed-By: Rod Vagg <r@va.gg>
v5.x
Ben Noordhuis 10 years ago
parent
commit
a9ad31fb3d
  1. 73
      test/parallel/test-http-header-response-splitting.js

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

@ -3,44 +3,75 @@ var common = require('../common'),
assert = require('assert'), assert = require('assert'),
http = require('http'); http = require('http');
var testIndex = 0, var testIndex = 0;
responses = 0; const testCount = 4 * 6;
const responseBody = 'Hi mars!';
var server = http.createServer(function(req, res) { var server = http.createServer(function(req, res) {
switch (testIndex++) { function reply(header) {
switch (testIndex % 4) {
case 0: case 0:
res.writeHead(200, { test: 'foo \r\ninvalid: bar' }); res.writeHead(200, { a: header, b: header });
break; break;
case 1: case 1:
res.writeHead(200, { test: 'foo \ninvalid: bar' }); res.setHeader('a', header);
res.setHeader('b', header);
res.writeHead(200);
break; break;
case 2: case 2:
res.writeHead(200, { test: 'foo \rinvalid: bar' }); res.setHeader('a', header);
res.writeHead(200, { b: header });
break; break;
case 3: case 3:
res.writeHead(200, { test: 'foo \n\n\ninvalid: bar' }); res.setHeader('a', [header]);
res.writeHead(200, { b: header });
break;
default:
assert.fail('unreachable');
}
res.end(responseBody);
}
switch ((testIndex / 4) | 0) {
case 0:
reply('foo \r\ninvalid: bar');
break;
case 1:
reply('foo \ninvalid: bar');
break;
case 2:
reply('foo \rinvalid: bar');
break;
case 3:
reply('foo \n\n\ninvalid: bar');
break; break;
case 4: case 4:
res.writeHead(200, { test: 'foo \r\n \r\n \r\ninvalid: bar' }); reply('foo \r\n \r\n \r\ninvalid: bar');
server.close(); break;
case 5:
reply('foo \r \n \r \n \r \ninvalid: bar');
break; break;
default: default:
assert(false); assert(false);
} }
res.end('Hi mars!'); if (++testIndex === testCount) {
server.close();
}
}); });
server.listen(common.PORT, function() { server.listen(common.PORT, common.mustCall(function() {
for (var i = 0; i < 5; i++) { for (var i = 0; i < testCount; i++) {
var req = http.get({ port: common.PORT, path: '/' }, function(res) { http.get({ port: common.PORT, path: '/' }, common.mustCall(function(res) {
assert.strictEqual(res.headers.test, 'foo invalid: bar'); assert.strictEqual(res.headers.a, 'foo invalid: bar');
assert.strictEqual(res.headers.b, 'foo invalid: bar');
assert.strictEqual(res.headers.foo, undefined);
assert.strictEqual(res.headers.invalid, undefined); assert.strictEqual(res.headers.invalid, undefined);
responses++; var data = '';
res.setEncoding('utf8');
res.on('data', function(s) { data += s; });
res.on('end', common.mustCall(function() {
assert.equal(data, responseBody);
}));
res.resume(); res.resume();
}); }));
} }
}); }));
process.on('exit', function() {
assert.strictEqual(responses, 5);
});

Loading…
Cancel
Save