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