summaryrefslogtreecommitdiff
path: root/lib/_http_agent.js
diff options
context:
space:
mode:
authorGerhard Stoebich <18708370+Flarna@users.noreply.github.com>2019-05-05 21:29:32 +0200
committerAnna Henningsen <anna@addaleax.net>2019-05-19 23:17:06 +0200
commit3d9d1ade2a361f408b116c5bafb2fcd560310f9c (patch)
tree7d0eb2feb0652bc9cf4609df6b1a437ea824303a /lib/_http_agent.js
parentee59763ab3b67f8792ed53a4d098212a040994f9 (diff)
downloadandroid-node-v8-3d9d1ade2a361f408b116c5bafb2fcd560310f9c.tar.gz
android-node-v8-3d9d1ade2a361f408b116c5bafb2fcd560310f9c.tar.bz2
android-node-v8-3d9d1ade2a361f408b116c5bafb2fcd560310f9c.zip
async_hooks: don't reuse resource in HttpAgent
As discussed in https://github.com/nodejs/diagnostics/issues/248, https://github.com/nodejs/node/pull/21313 and https://docs.google.com/document/d/1g8OrG5lMIUhRn1zbkutgY83MiTSMx-0NHDs8Bf-nXxM/preview reusing the resource object is a blocker for landing a resource based async hooks API and get rid of the promise destroy hook. This PR ensures that HttpAgent uses the a new resource object in case the socket handle gets reused. PR-URL: https://github.com/nodejs/node/pull/27581 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'lib/_http_agent.js')
-rw-r--r--lib/_http_agent.js14
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/_http_agent.js b/lib/_http_agent.js
index eb98f2b0bd..12f8529c38 100644
--- a/lib/_http_agent.js
+++ b/lib/_http_agent.js
@@ -40,6 +40,13 @@ const { async_id_symbol } = require('internal/async_hooks').symbols;
// ClientRequest.onSocket(). The Agent is now *strictly*
// concerned with managing a connection pool.
+class ReusedHandle {
+ constructor(type, handle) {
+ this.type = type;
+ this.handle = handle;
+ }
+}
+
function Agent(options) {
if (!(this instanceof Agent))
return new Agent(options);
@@ -166,10 +173,11 @@ Agent.prototype.addRequest = function addRequest(req, options, port/* legacy */,
// We have a free socket, so use that.
var socket = this.freeSockets[name].shift();
// Guard against an uninitialized or user supplied Socket.
- if (socket._handle && typeof socket._handle.asyncReset === 'function') {
+ const handle = socket._handle;
+ if (handle && typeof handle.asyncReset === 'function') {
// Assign the handle a new asyncId and run any destroy()/init() hooks.
- socket._handle.asyncReset();
- socket[async_id_symbol] = socket._handle.getAsyncId();
+ handle.asyncReset(new ReusedHandle(handle.getProviderType(), handle));
+ socket[async_id_symbol] = handle.getAsyncId();
}
// don't leak