| 'use strict'; |
| |
| const common = require('../common'); |
| const assert = require('assert'); |
| const http = require('http'); |
| |
| function createServer(count) { |
| return http.createServer(common.mustCallAtLeast((req, res) => { |
| // Return the remote port number used for this connection. |
| res.end(req.socket.remotePort.toString(10)); |
| }), count); |
| } |
| |
| function makeRequest(url, agent, callback) { |
| http |
| .request(url, { agent }, (res) => { |
| let data = ''; |
| res.setEncoding('ascii'); |
| res.on('data', (c) => { |
| data += c; |
| }); |
| res.on('end', () => { |
| process.nextTick(callback, data); |
| }); |
| }) |
| .end(); |
| } |
| |
| function bulkRequest(url, agent, done) { |
| const ports = []; |
| let count = agent.maxSockets; |
| |
| for (let i = 0; i < agent.maxSockets; i++) { |
| makeRequest(url, agent, callback); |
| } |
| |
| function callback(port) { |
| count -= 1; |
| ports.push(port); |
| if (count === 0) { |
| done(ports); |
| } |
| } |
| } |
| |
| function defaultTest() { |
| const server = createServer(8); |
| server.listen(0, onListen); |
| |
| function onListen() { |
| const url = `http://localhost:${server.address().port}`; |
| const agent = new http.Agent({ |
| keepAlive: true, |
| maxSockets: 5 |
| }); |
| |
| bulkRequest(url, agent, (ports) => { |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[ports.length - 1], port); |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[ports.length - 1], port); |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[ports.length - 1], port); |
| server.close(); |
| agent.destroy(); |
| }); |
| }); |
| }); |
| }); |
| } |
| } |
| |
| function fifoTest() { |
| const server = createServer(8); |
| server.listen(0, onListen); |
| |
| function onListen() { |
| const url = `http://localhost:${server.address().port}`; |
| const agent = new http.Agent({ |
| keepAlive: true, |
| maxSockets: 5, |
| scheduling: 'fifo' |
| }); |
| |
| bulkRequest(url, agent, (ports) => { |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[0], port); |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[1], port); |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[2], port); |
| server.close(); |
| agent.destroy(); |
| }); |
| }); |
| }); |
| }); |
| } |
| } |
| |
| function lifoTest() { |
| const server = createServer(8); |
| server.listen(0, onListen); |
| |
| function onListen() { |
| const url = `http://localhost:${server.address().port}`; |
| const agent = new http.Agent({ |
| keepAlive: true, |
| maxSockets: 5, |
| scheduling: 'lifo' |
| }); |
| |
| bulkRequest(url, agent, (ports) => { |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[ports.length - 1], port); |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[ports.length - 1], port); |
| makeRequest(url, agent, (port) => { |
| assert.strictEqual(ports[ports.length - 1], port); |
| server.close(); |
| agent.destroy(); |
| }); |
| }); |
| }); |
| }); |
| } |
| } |
| |
| function badSchedulingOptionTest() { |
| try { |
| new http.Agent({ |
| keepAlive: true, |
| maxSockets: 5, |
| scheduling: 'filo' |
| }); |
| } catch (err) { |
| assert.strictEqual(err.code, 'ERR_INVALID_ARG_VALUE'); |
| assert.strictEqual( |
| err.message, |
| "The argument 'scheduling' must be one of: 'fifo', 'lifo'. " + |
| "Received 'filo'" |
| ); |
| } |
| } |
| |
| defaultTest(); |
| fifoTest(); |
| lifoTest(); |
| badSchedulingOptionTest(); |