mirror of
https://github.com/nodejs/node.git
synced 2025-05-07 15:35:41 +00:00

Have clearer ownership relations between the `Http2Ping`, `Http2Settings` and `Http2Session` objects. Ping and Settings objects are now owned by the `Http2Session` instance, and deleted along with it, so neither type of object refers to the session after it is gone. In the case of `Http2Ping`s, that deletion is slightly delayed, so we explicitly reset its `session_` property. Fixes: https://github.com/nodejs/node/issues/28088 PR-URL: https://github.com/nodejs/node/pull/28150 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
37 lines
1.0 KiB
JavaScript
37 lines
1.0 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
if (!common.hasCrypto)
|
|
common.skip('missing crypto');
|
|
|
|
const http2 = require('http2');
|
|
const v8 = require('v8');
|
|
|
|
// Regression test for https://github.com/nodejs/node/issues/28088:
|
|
// Verify that Http2Settings and Http2Ping objects don't reference the session
|
|
// after it is destroyed, either because they are detached from it or have been
|
|
// destroyed themselves.
|
|
|
|
for (const variant of ['ping', 'settings']) {
|
|
const server = http2.createServer();
|
|
server.on('session', common.mustCall((session) => {
|
|
if (variant === 'ping') {
|
|
session.ping(common.expectsError({
|
|
code: 'ERR_HTTP2_PING_CANCEL'
|
|
}));
|
|
} else {
|
|
session.settings(undefined, common.mustNotCall());
|
|
}
|
|
|
|
session.on('close', common.mustCall(() => {
|
|
v8.getHeapSnapshot().resume();
|
|
server.close();
|
|
}));
|
|
session.destroy();
|
|
}));
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
http2.connect(`http://localhost:${server.address().port}`,
|
|
common.mustCall());
|
|
}));
|
|
}
|