'use strict';
const common = require('../common');
const fixtures = require('../common/fixtures');
if (!common.hasCrypto)
  common.skip('missing crypto');

const assert = require('assert');
const https = require('https');

const options = {
  key: fixtures.readKey('agent1-key.pem'),
  cert: fixtures.readKey('agent1-cert.pem')
};

const TOTAL = 4;
let waiting = TOTAL;

const server = https.Server(options, function(req, res) {
  if (--waiting === 0) server.close();

  const servername = req.socket.servername;

  if (servername !== false) {
    res.setHeader('x-sni', servername);
  }

  res.end('hello world');
});

server.listen(0, common.mustCall(function() {
  function expectResponse(id) {
    return common.mustCall(function(res) {
      res.resume();
      assert.strictEqual(res.headers['x-sni'],
                         id === false ? undefined : `sni.${id}`);
    });
  }

  const agent = new https.Agent({
    maxSockets: 1
  });
  for (let j = 0; j < TOTAL; j++) {
    https.get({
      agent: agent,

      path: '/',
      port: this.address().port,
      host: '127.0.0.1',
      servername: `sni.${j}`,
      rejectUnauthorized: false
    }, expectResponse(j));
  }
  https.get({
    agent: agent,

    path: '/',
    port: this.address().port,
    host: '127.0.0.1',
    servername: '',
    rejectUnauthorized: false
  }, expectResponse(false));
}));
