http2: release request()'s "connect" event listener after it runs
The `Http2Session#request()` method internally listens to the "connect" event if the session has not yet established a connection so that the actual request can be sent after the connection has been established. This commit removes the event listener after it runs and carries out the request and is no longer needed. In practice this shouldn't affect the behavior of the session object since the "connect" event fires only once anyway, but removing the listener releases its references. The rest of this class subscribes to the "connect" event with `once` instead of `on` as well. Tested by adding a new test that ensures `Http2Session#request()` is called before the connection is established, indicated by a "connect" listener that is run. The test also ensures all "connect" listeners are removed after the connection is established. PR-URL: https://github.com/nodejs/node/pull/21916 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
parent
8c6d1a0686
commit
2aca0957f4
@ -1426,7 +1426,7 @@ class ClientHttp2Session extends Http2Session {
|
||||
|
||||
const onConnect = requestOnConnect.bind(stream, headersList, options);
|
||||
if (this.connecting) {
|
||||
this.on('connect', onConnect);
|
||||
this.once('connect', onConnect);
|
||||
} else {
|
||||
onConnect();
|
||||
}
|
||||
|
28
test/parallel/test-http2-request-remove-connect-listener.js
Normal file
28
test/parallel/test-http2-request-remove-connect-listener.js
Normal file
@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
if (!common.hasCrypto)
|
||||
common.skip('missing crypto');
|
||||
const assert = require('assert');
|
||||
const http2 = require('http2');
|
||||
|
||||
|
||||
const server = http2.createServer();
|
||||
server.on('stream', common.mustCall((stream) => {
|
||||
stream.respond();
|
||||
stream.end();
|
||||
}));
|
||||
|
||||
server.listen(0, common.mustCall(() => {
|
||||
const client = http2.connect(`http://localhost:${server.address().port}`);
|
||||
const req = client.request();
|
||||
client.once('connect', common.mustCall());
|
||||
|
||||
req.on('response', common.mustCall(() => {
|
||||
assert.strictEqual(client.listenerCount('connect'), 0);
|
||||
}));
|
||||
req.on('close', common.mustCall(() => {
|
||||
server.close();
|
||||
client.close();
|
||||
}));
|
||||
}));
|
Loading…
x
Reference in New Issue
Block a user