From 959f1d1a15c0da54fcd94070dab1ad574d17fa7e Mon Sep 17 00:00:00 2001 From: RafaelGSS Date: Wed, 2 Mar 2022 15:02:41 -0300 Subject: [PATCH] http2: add edge case to GOAWAY request --- doc/api/http2.md | 6 +++++ .../test-http2-goaway-delayed-request.js | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 test/parallel/test-http2-goaway-delayed-request.js diff --git a/doc/api/http2.md b/doc/api/http2.md index a2141e995f0a38..627ec03357424f 100644 --- a/doc/api/http2.md +++ b/doc/api/http2.md @@ -922,6 +922,12 @@ For HTTP/2 Client `Http2Session` instances only, the `http2session.request()` creates and returns an `Http2Stream` instance that can be used to send an HTTP/2 request to the connected server. +When a `ClientHttp2Session` is first created, the socket may not yet be +connected. if `clienthttp2session.request()` is called during this time, the +actual request will be deferred until the socket is ready to go. +If the `session` is closed before the actual request be executed, an +`ERR_HTTP2_GOAWAY_SESSION` is thrown. + This method is only available if `http2session.type` is equal to `http2.constants.NGHTTP2_SESSION_CLIENT`. diff --git a/test/parallel/test-http2-goaway-delayed-request.js b/test/parallel/test-http2-goaway-delayed-request.js new file mode 100644 index 00000000000000..d03406f1d18b92 --- /dev/null +++ b/test/parallel/test-http2-goaway-delayed-request.js @@ -0,0 +1,24 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +const http2 = require('http2'); + +const server = http2.createServer(); + +server.listen(0, () => { + const client = http2.connect(`http://localhost:${server.address().port}`); + client.on('close', common.mustCall(() => { + server.close(); + })); + + // The client.close() is executed before the socket is able to make request + const stream = client.request(); + stream.on('error', common.expectsError({ code: 'ERR_HTTP2_GOAWAY_SESSION' })); + + setTimeout(() => { + client.close(); + }, 1); +});