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
26  // Create a first request but never finish it
27  const client1 = connect(port);
28
29  client1.on('connect', common.mustCall(() => {
30    // Create a second request, let it finish but leave the connection opened using HTTP keep-alive
31    const client2 = connect(port);
32    let response = '';
33
34    client2.setEncoding('utf8');
35
36    client2.on('data', common.mustCall((chunk) => {
37      response += chunk;
38
39      if (response.endsWith('0\r\n\r\n')) {
40        assert(response.startsWith('HTTP/1.1 200 OK\r\nConnection: keep-alive'));
41        assert.strictEqual(connections, 2);
42
43        server.closeAllConnections();
44        server.close(common.mustCall());
45
46        // This timer should never go off as the server.close should shut everything down
47        setTimeout(common.mustNotCall(), common.platformTimeout(1500)).unref();
48      }
49    }));
50
51    client2.on('close', common.mustCall());
52
53    client2.write('GET / HTTP/1.1\r\n\r\n');
54  }));
55
56  client1.on('close', common.mustCall());
57
58  client1.on('error', () => {});
59
60  client1.write('GET / HTTP/1.1');
61});
62