|
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
|
|
const http = require('http');
|
|
|
|
|
|
|
|
var testIndex = 0;
|
|
|
|
const testCount = 2 * 4 * 6;
|
|
|
|
const responseBody = 'Hi mars!';
|
|
|
|
|
|
|
|
var server = http.createServer(function(req, res) {
|
|
|
|
function reply(header) {
|
|
|
|
switch (testIndex % 4) {
|
|
|
|
case 0:
|
|
|
|
res.writeHead(200, { a: header, b: header });
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
res.setHeader('a', header);
|
|
|
|
res.setHeader('b', header);
|
|
|
|
res.writeHead(200);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
res.setHeader('a', header);
|
|
|
|
res.writeHead(200, { b: header });
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
res.setHeader('a', [header]);
|
|
|
|
res.writeHead(200, { b: header });
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
assert.fail(null, null, 'unreachable');
|
|
|
|
}
|
|
|
|
res.write(responseBody);
|
|
|
|
if (testIndex % 8 < 4) {
|
|
|
|
res.addTrailers({ ta: header, tb: header });
|
|
|
|
} else {
|
|
|
|
res.addTrailers([['ta', header], ['tb', header]]);
|
|
|
|
}
|
|
|
|
res.end();
|
|
|
|
}
|
|
|
|
switch ((testIndex / 8) | 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;
|
|
|
|
case 4:
|
|
|
|
reply('foo \r\n \r\n \r\ninvalid: bar');
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
reply('foo \r \n \r \n \r \ninvalid: bar');
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
assert(false);
|
|
|
|
}
|
|
|
|
if (++testIndex === testCount) {
|
|
|
|
server.close();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
server.listen(common.PORT, common.mustCall(function() {
|
|
|
|
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);
|
|
|
|
assert.strictEqual(res.trailers.ta, 'foo invalid: bar');
|
|
|
|
assert.strictEqual(res.trailers.tb, 'foo invalid: bar');
|
|
|
|
assert.strictEqual(res.trailers.foo, undefined);
|
|
|
|
assert.strictEqual(res.trailers.invalid, undefined);
|
|
|
|
}));
|
|
|
|
res.resume();
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
}));
|