| 'use strict'; |
| |
| const common = require('../common'); |
| const assert = require('assert'); |
| const http = require('http'); |
| const Countdown = require('../common/countdown'); |
| |
| assert.throws(() => new http.Agent({ |
| maxTotalSockets: 'test', |
| }), { |
| code: 'ERR_INVALID_ARG_TYPE', |
| name: 'TypeError', |
| message: 'The "maxTotalSockets" argument must be of type number. ' + |
| "Received type string ('test')", |
| }); |
| |
| [-1, 0, NaN].forEach((item) => { |
| assert.throws(() => new http.Agent({ |
| maxTotalSockets: item, |
| }), { |
| code: 'ERR_OUT_OF_RANGE', |
| name: 'RangeError', |
| message: 'The value of "maxTotalSockets" is out of range. ' + |
| `It must be > 0. Received ${item}`, |
| }); |
| }); |
| |
| assert.ok(new http.Agent({ |
| maxTotalSockets: Infinity, |
| })); |
| |
| function start(param = {}) { |
| const { maxTotalSockets, maxSockets } = param; |
| |
| const agent = new http.Agent({ |
| keepAlive: true, |
| keepAliveMsecs: 1000, |
| maxTotalSockets, |
| maxSockets, |
| maxFreeSockets: 3 |
| }); |
| |
| const server = http.createServer(common.mustCall((req, res) => { |
| res.end('hello world'); |
| }, 6)); |
| const server2 = http.createServer(common.mustCall((req, res) => { |
| res.end('hello world'); |
| }, 6)); |
| |
| server.keepAliveTimeout = 0; |
| server2.keepAliveTimeout = 0; |
| |
| const countdown = new Countdown(12, () => { |
| assert.strictEqual(getRequestCount(), 0); |
| agent.destroy(); |
| server.close(); |
| server2.close(); |
| }); |
| |
| function handler(s) { |
| for (let i = 0; i < 6; i++) { |
| http.get({ |
| host: 'localhost', |
| port: s.address().port, |
| agent, |
| path: `/${i}`, |
| }, common.mustCall((res) => { |
| assert.strictEqual(res.statusCode, 200); |
| res.resume(); |
| res.on('end', common.mustCall(() => { |
| for (const key of Object.keys(agent.sockets)) { |
| assert(agent.sockets[key].length <= maxSockets); |
| } |
| assert(getTotalSocketsCount() <= maxTotalSockets); |
| countdown.dec(); |
| })); |
| })); |
| } |
| } |
| |
| function getTotalSocketsCount() { |
| let num = 0; |
| for (const key of Object.keys(agent.sockets)) { |
| num += agent.sockets[key].length; |
| } |
| return num; |
| } |
| |
| function getRequestCount() { |
| let num = 0; |
| for (const key of Object.keys(agent.requests)) { |
| num += agent.requests[key].length; |
| } |
| return num; |
| } |
| |
| server.listen(0, common.mustCall(() => handler(server))); |
| server2.listen(0, common.mustCall(() => handler(server2))); |
| } |
| |
| // If maxTotalSockets is larger than maxSockets, |
| // then the origin check will be skipped |
| // when the socket is removed. |
| [{ |
| maxTotalSockets: 2, |
| maxSockets: 3, |
| }, { |
| maxTotalSockets: 3, |
| maxSockets: 2, |
| }, { |
| maxTotalSockets: 2, |
| maxSockets: 2, |
| }].forEach(start); |