mirror of https://github.com/lukechilds/node.git
Browse Source
Introduce two overridable `Agent` methods: * `keepSocketAlive(socket)` * `reuseSocket(socket, req)` These methods can be overridden by particular `Agent` class child to make keep-alive behavior customizable. Motivation: destroy persisted sockets after some configurable timeout. It is very non-trivial to do it with available primitives. Such program will most likely need to poke with undocumented events and methods of `Agent`. With introduced API such behavior is easy to implement. PR-URL: https://github.com/nodejs/node/pull/13005 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Brian White <mscdex@mscdex.net> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>v6
3 changed files with 120 additions and 5 deletions
@ -0,0 +1,67 @@ |
|||||
|
'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(); |
||||
|
})); |
||||
|
})); |
||||
|
})); |
||||
|
})); |
Loading…
Reference in new issue