From ba7f38b1f376778f279b22a9a44f56c1079fe3b4 Mon Sep 17 00:00:00 2001 From: Madara Uchiha Date: Tue, 10 Nov 2020 19:06:41 +0200 Subject: [PATCH 1/9] http2: add support for AbortSignal to http2Session.request - Add support - Add test - Docs once PR is up --- lib/internal/http2/core.js | 11 ++++++++ test/parallel/test-http2-client-destroy.js | 29 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 2ea8eacd0c10a2..512b2fa6fadb7c 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -118,6 +118,7 @@ const { validateNumber, validateString, validateUint32, + validateAbortSignal, } = require('internal/validators'); const fsPromisesInternal = require('internal/fs/promises'); const { utcDate } = require('internal/http'); @@ -1721,6 +1722,16 @@ class ClientHttp2Session extends Http2Session { if (options.waitForTrailers) stream[kState].flags |= STREAM_FLAGS_HAS_TRAILERS; + const signal = options.signal; + if (options.signal) { + validateAbortSignal(signal, 'options.signal'); + const listener = () => stream.destroy(); + signal.addEventListener('abort', listener); + stream.once('close', () => { + signal.removeEventListener('abort', listener); + }) + } + const onConnect = FunctionPrototypeBind(requestOnConnect, stream, headersList, options); if (this.connecting) { diff --git a/test/parallel/test-http2-client-destroy.js b/test/parallel/test-http2-client-destroy.js index c91e88079db6bb..178eaf3d1e5ac7 100644 --- a/test/parallel/test-http2-client-destroy.js +++ b/test/parallel/test-http2-client-destroy.js @@ -167,3 +167,32 @@ const Countdown = require('../common/countdown'); req.on('close', common.mustCall(() => server.close())); })); } + +// Destroy with AbortSignal +{ + const server = h2.createServer(); + const controller = new AbortController(); + + server.on('stream', common.mustNotCall()); + server.listen(0, common.mustCall(() => { + const client = h2.connect(`http://localhost:${server.address().port}`); + client.on('close', common.mustCall()); + const socket = client[kSocket]; + socket.on('close', common.mustCall(() => { + assert(socket.destroyed); + })); + + const req = client.request({}, { signal: controller.signal }); + client.on('error', common.mustCall((err) => { + assert.strictEqual(err.code, 'ECONNREFUSED'); + server.close(); + })); + + assert.strictEqual(req.aborted, false); + assert.strictEqual(req.destroyed, false); + controller.abort(); + assert.strictEqual(req.aborted, false); + assert.strictEqual(req.destroyed, true); + req.on('close', common.mustCall(() => server.close())); + })); +} \ No newline at end of file From aec2c2b682068b5d1fc19e827fb2d55048173c47 Mon Sep 17 00:00:00 2001 From: Madara Uchiha Date: Tue, 10 Nov 2020 19:14:04 +0200 Subject: [PATCH 2/9] http2: Document AbortSignalSupport --- doc/api/http2.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/api/http2.md b/doc/api/http2.md index 9fc447b657b368..6abccafefa48ad 100644 --- a/doc/api/http2.md +++ b/doc/api/http2.md @@ -2,6 +2,10 @@