1'use strict';
2const common = require('../common');
3const assert = require('assert');
4
5if (!common.hasCrypto) {
6  common.skip('missing crypto');
7}
8
9const { createServer } = require('https');
10const { connect } = require('tls');
11
12const fixtures = require('../common/fixtures');
13
14const options = {
15  key: fixtures.readKey('agent1-key.pem'),
16  cert: fixtures.readKey('agent1-cert.pem')
17};
18
19let connections = 0;
20
21const server = createServer(options, common.mustCall(function(req, res) {
22  res.writeHead(200, { Connection: 'keep-alive' });
23  res.end();
24}), {
25  headersTimeout: 0,
26  keepAliveTimeout: 0,
27  requestTimeout: common.platformTimeout(60000),
28});
29
30server.on('connection', function() {
31  connections++;
32});
33
34server.listen(0, function() {
35  const port = server.address().port;
36  let client1Closed = false;
37  let client2Closed = false;
38
39  // Create a first request but never finish it
40  const client1 = connect({ port, rejectUnauthorized: false });
41
42  client1.on('connect', common.mustCall(() => {
43    // Create a second request, let it finish but leave the connection opened using HTTP keep-alive
44    const client2 = connect({ port, rejectUnauthorized: false });
45    let response = '';
46
47    client2.setEncoding('utf8');
48    client2.on('data', common.mustCall((chunk) => {
49      response += chunk;
50
51      if (response.endsWith('0\r\n\r\n')) {
52        assert(response.startsWith('HTTP/1.1 200 OK\r\nConnection: keep-alive'));
53        assert.strictEqual(connections, 2);
54
55        server.close(common.mustCall());
56
57        // Check that only the idle connection got closed
58        setTimeout(common.mustCall(() => {
59          assert(!client1Closed);
60          assert(client2Closed);
61
62          server.closeAllConnections();
63          server.close(common.mustCall());
64        }), common.platformTimeout(500)).unref();
65      }
66    }));
67
68    client2.on('close', common.mustCall(() => {
69      client2Closed = true;
70    }));
71
72    client2.write('GET / HTTP/1.1\r\n\r\n');
73  }));
74
75  client1.on('close', common.mustCall(() => {
76    client1Closed = true;
77  }));
78
79  client1.on('error', () => {});
80
81  client1.write('GET / HTTP/1.1');
82});
83