'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');
      })
    );
  }
}));
