• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.closeIdleConnections();
46        server.close(common.mustCall());
47
48        // Check that only the idle connection got closed
49        setTimeout(common.mustCall(() => {
50          assert(!client1Closed);
51          assert(client2Closed);
52
53          server.closeAllConnections();
54          server.close(common.mustCall());
55        }), common.platformTimeout(500)).unref();
56      }
57    }));
58
59    client2.on('close', common.mustCall(() => {
60      client2Closed = true;
61    }));
62
63    client2.write('GET / HTTP/1.1\r\n\r\n');
64  }));
65
66  client1.on('close', common.mustCall(() => {
67    client1Closed = true;
68  }));
69
70  client1.on('error', () => {});
71
72  client1.write('GET / HTTP/1.1');
73});
74