test: test more http response splitting scenarios
authorBen Noordhuis <info@bnoordhuis.nl>
Fri, 18 Sep 2015 02:25:28 +0000 (04:25 +0200)
committerJeremiah Senkpiel <fishrock123@rocketmail.com>
Sun, 20 Sep 2015 17:31:26 +0000 (10:31 -0700)
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>
test/parallel/test-http-header-response-splitting.js

index b499ae3..c89497f 100644 (file)
@@ -3,44 +3,75 @@ var common = require('../common'),
     assert = require('assert'),
     http = require('http');
 
-var testIndex = 0,
-    responses = 0;
+var testIndex = 0;
+const testCount = 4 * 6;
+const responseBody = 'Hi mars!';
 
 var server = http.createServer(function(req, res) {
-  switch (testIndex++) {
+  function reply(header) {
+    switch (testIndex % 4) {
     case 0:
-      res.writeHead(200, { test: 'foo \r\ninvalid: bar' });
+      res.writeHead(200, { a: header, b: header });
       break;
     case 1:
-      res.writeHead(200, { test: 'foo \ninvalid: bar' });
+      res.setHeader('a', header);
+      res.setHeader('b', header);
+      res.writeHead(200);
       break;
     case 2:
-      res.writeHead(200, { test: 'foo \rinvalid: bar' });
+      res.setHeader('a', header);
+      res.writeHead(200, { b: header });
       break;
     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;
     case 4:
-      res.writeHead(200, { test: 'foo \r\n \r\n \r\ninvalid: bar' });
-      server.close();
+      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);
   }
-  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');
+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);
-      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();
-    });
+    }));
   }
-});
-
-process.on('exit', function() {
-  assert.strictEqual(responses, 5);
-});
+}));