mirror of https://gitee.com/openkylin/nodejs.git
114 lines
2.7 KiB
JavaScript
114 lines
2.7 KiB
JavaScript
'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);
|