From 8e5e01cd8a8ca1962625dd041b9cfb39370085b3 Mon Sep 17 00:00:00 2001 From: leeight Date: Wed, 21 Nov 2018 16:53:15 +0800 Subject: [PATCH 1/2] http2: fix session[kSession] undefined issue `finishSessionDestroy` already done session cleaning up. Fix: https://github.com/nodejs/node/issues/24546 --- lib/internal/http2/core.js | 1 + .../test-http2-server-session-destroy.js | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 test/parallel/test-http2-server-session-destroy.js diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 0302d535c3731d..a020838493fbab 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -1989,6 +1989,7 @@ class Http2Stream extends Duplex { // attempt to gracefully close the session. const state = this[kState]; if (this.headersSent && + this[kSession] && this[kSession][kType] === NGHTTP2_SESSION_SERVER && !(state.flags & STREAM_FLAGS_HAS_TRAILERS) && !state.didRead && diff --git a/test/parallel/test-http2-server-session-destroy.js b/test/parallel/test-http2-server-session-destroy.js new file mode 100644 index 00000000000000..0cf84dd10d2344 --- /dev/null +++ b/test/parallel/test-http2-server-session-destroy.js @@ -0,0 +1,16 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const h2 = require('http2'); + +const server = h2.createServer(); +server.listen(0, common.mustCall(() => { + h2.connect(`http://localhost:${server.address().port}`, (session) => { + session.request({ ':method': 'POST' }).end(common.mustCall(() => { + session.destroy(); + server.close(); + })); + }); +})); From 90e83cdba2c7658c6fe3b5d82e36a98ddd9b3650 Mon Sep 17 00:00:00 2001 From: Ouyang Yadong Date: Wed, 21 Nov 2018 22:16:35 +0800 Subject: [PATCH 2/2] https: test/parallel/test-http2-server-session-destroy.js Co-Authored-By: leeight --- test/parallel/test-http2-server-session-destroy.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-http2-server-session-destroy.js b/test/parallel/test-http2-server-session-destroy.js index 0cf84dd10d2344..9b7f126510757c 100644 --- a/test/parallel/test-http2-server-session-destroy.js +++ b/test/parallel/test-http2-server-session-destroy.js @@ -6,11 +6,15 @@ if (!common.hasCrypto) const h2 = require('http2'); const server = h2.createServer(); -server.listen(0, common.mustCall(() => { - h2.connect(`http://localhost:${server.address().port}`, (session) => { +server.listen(0, common.localhostIPv4, common.mustCall(() => { + const afterConnect = common.mustCall((session) => { session.request({ ':method': 'POST' }).end(common.mustCall(() => { session.destroy(); server.close(); })); }); + + const port = server.address().port; + const host = common.localhostIPv4; + h2.connect('http://' + host + ':' + port, afterConnect); }));