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