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>
This commit is contained in:
parent
4144cb054c
commit
a9ad31fb3d
@ -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() {
|
|
||||||
for (var i = 0; i < 5; i++) {
|
|
||||||
var req = http.get({ port: common.PORT, path: '/' }, function(res) {
|
|
||||||
assert.strictEqual(res.headers.test, 'foo invalid: bar');
|
|
||||||
assert.strictEqual(res.headers.invalid, undefined);
|
|
||||||
responses++;
|
|
||||||
res.resume();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on('exit', function() {
|
server.listen(common.PORT, common.mustCall(function() {
|
||||||
assert.strictEqual(responses, 5);
|
for (var i = 0; i < testCount; i++) {
|
||||||
});
|
http.get({ port: common.PORT, path: '/' }, common.mustCall(function(res) {
|
||||||
|
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);
|
||||||
|
var data = '';
|
||||||
|
res.setEncoding('utf8');
|
||||||
|
res.on('data', function(s) { data += s; });
|
||||||
|
res.on('end', common.mustCall(function() {
|
||||||
|
assert.equal(data, responseBody);
|
||||||
|
}));
|
||||||
|
res.resume();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user