| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| |
| const http = require('http'); |
| |
| const server = http.createServer((req, res) => { |
| res.end('ok'); |
| }).listen(0, common.mustCall(() => { |
| const agent = http.Agent({ |
| keepAlive: true, |
| maxSockets: 5, |
| maxFreeSockets: 2 |
| }); |
| |
| const keepSocketAlive = agent.keepSocketAlive; |
| const reuseSocket = agent.reuseSocket; |
| |
| let called = 0; |
| let expectedSocket; |
| agent.keepSocketAlive = common.mustCall((socket) => { |
| assert(socket); |
| |
| called++; |
| if (called === 1) { |
| return false; |
| } else if (called === 2) { |
| expectedSocket = socket; |
| return keepSocketAlive.call(agent, socket); |
| } |
| |
| assert.strictEqual(socket, expectedSocket); |
| return false; |
| }, 3); |
| |
| agent.reuseSocket = common.mustCall((socket, req) => { |
| assert.strictEqual(socket, expectedSocket); |
| assert(req); |
| |
| return reuseSocket.call(agent, socket, req); |
| }, 1); |
| |
| function req(callback) { |
| http.request({ |
| method: 'GET', |
| path: '/', |
| agent, |
| port: server.address().port |
| }, common.mustCall((res) => { |
| res.resume(); |
| res.once('end', common.mustCall(() => { |
| setImmediate(callback); |
| })); |
| })).end(); |
| } |
| |
| // Should destroy socket instead of keeping it alive |
| req(common.mustCall(() => { |
| // Should keep socket alive |
| req(common.mustCall(() => { |
| // Should reuse the socket |
| req(common.mustCall(() => { |
| server.close(); |
| })); |
| })); |
| })); |
| })); |