1'use strict';
2const common = require('../common');
3const http = require('http');
4const assert = require('assert');
5
6const agent = new http.Agent({ keepAlive: true });
7
8const server = http.createServer((req, res) => {
9  res.end('');
10});
11
12// Maximum allowed value for timeouts
13const timeout = 2 ** 31 - 1;
14
15const options = {
16  agent,
17  method: 'GET',
18  port: undefined,
19  host: common.localhostIPv4,
20  path: '/',
21  timeout: timeout
22};
23
24server.listen(0, options.host, common.mustCall(() => {
25  options.port = server.address().port;
26  doRequest(common.mustCall((numListeners) => {
27    assert.strictEqual(numListeners, 3);
28    doRequest(common.mustCall((numListeners) => {
29      assert.strictEqual(numListeners, 3);
30      server.close();
31      agent.destroy();
32    }));
33  }));
34}));
35
36function doRequest(cb) {
37  http.request(options, common.mustCall((response) => {
38    const sockets = agent.sockets[`${options.host}:${options.port}:`];
39    assert.strictEqual(sockets.length, 1);
40    const socket = sockets[0];
41    const numListeners = socket.listeners('timeout').length;
42    response.resume();
43    response.once('end', common.mustCall(() => {
44      process.nextTick(cb, numListeners);
45    }));
46  })).end();
47}
48