• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.closeIdleConnections();
56        server.close(common.mustCall());
57
58        // Check that only the idle connection got closed
59        setTimeout(common.mustCall(() => {
60          assert(!client1Closed);
61          assert(client2Closed);
62
63          server.closeAllConnections();
64          server.close(common.mustCall());
65        }), common.platformTimeout(500)).unref();
66      }
67    }));
68
69    client2.on('close', common.mustCall(() => {
70      client2Closed = true;
71    }));
72
73    client2.write('GET / HTTP/1.1\r\n\r\n');
74  }));
75
76  client1.on('close', common.mustCall(() => {
77    client1Closed = true;
78  }));
79
80  client1.on('error', () => {});
81
82  client1.write('GET / HTTP/1.1');
83});
84