'use strict'; const common = require('../common'); const http = require('http'); const assert = require('assert'); const Countdown = require('../common/countdown'); // Test that certain response header fields do not repeat. // 'content-length' should also be in this list but it is // handled differently because multiple content-lengths are // an error (see test-http-response-multi-content-length.js). const norepeat = [ 'content-type', 'user-agent', 'referer', 'host', 'authorization', 'proxy-authorization', 'if-modified-since', 'if-unmodified-since', 'from', 'location', 'max-forwards', 'retry-after', 'etag', 'last-modified', 'server', 'age', 'expires' ]; const runCount = 2; const server = http.createServer(function(req, res) { const num = req.headers['x-num']; if (num === '1') { for (const name of norepeat) { res.setHeader(name, ['A', 'B']); } res.setHeader('X-A', ['A', 'B']); } else if (num === '2') { const headers = {}; for (const name of norepeat) { headers[name] = ['A', 'B']; } headers['X-A'] = ['A', 'B']; res.writeHead(200, headers); } res.end('ok'); }); server.listen(0, common.mustCall(function() { const countdown = new Countdown(runCount, () => server.close()); for (let n = 1; n <= runCount; n++) { // This runs twice, the first time, the server will use // setHeader, the second time it uses writeHead. The // result on the client side should be the same in // either case -- only the first instance of the header // value should be reported for the header fields listed // in the norepeat array. http.get( { port: this.address().port, headers: { 'x-num': n } }, common.mustCall(function(res) { countdown.dec(); for (const name of norepeat) { assert.strictEqual(res.headers[name], 'A'); } assert.strictEqual(res.headers['x-a'], 'A, B'); }) ); } }));