diff options
author | Matteo Collina <hello@matteocollina.com> | 2019-10-02 13:02:37 +0200 |
---|---|---|
committer | Matteo Collina <hello@matteocollina.com> | 2019-12-03 12:14:56 +0100 |
commit | 415bba752ffcdc28ccae6cdf567e739be77ad6f9 (patch) | |
tree | 8d2cc1b4565abda6c709ba271ad4f55511dfa93d /lib/internal/http2 | |
parent | ed8619899735df53f9463bac0b10524f3c15a218 (diff) | |
download | android-node-v8-415bba752ffcdc28ccae6cdf567e739be77ad6f9.tar.gz android-node-v8-415bba752ffcdc28ccae6cdf567e739be77ad6f9.tar.bz2 android-node-v8-415bba752ffcdc28ccae6cdf567e739be77ad6f9.zip |
http2: implement capture rection for 'request' and 'stream' events
PR-URL: https://github.com/nodejs/node/pull/27867
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Diffstat (limited to 'lib/internal/http2')
-rw-r--r-- | lib/internal/http2/core.js | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index c4d12f9205..167044f840 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -1388,6 +1388,17 @@ class Http2Session extends EventEmitter { this[kMaybeDestroy](); } + [EventEmitter.captureRejectionSymbol](err, event, ...args) { + switch (event) { + case 'stream': + const [stream] = args; + stream.destroy(err); + break; + default: + this.destroy(err); + } + } + // Destroy the session if: // * error is not undefined/null // * session is closed and there are no more pending or open streams @@ -2875,6 +2886,40 @@ class Http2Server extends NETServer { } } +Http2Server.prototype[EventEmitter.captureRejectionSymbol] = function( + err, event, ...args) { + + switch (event) { + case 'stream': + // TODO(mcollina): we might want to match this with what we do on + // the compat side. + const [stream] = args; + if (stream.sentHeaders) { + stream.destroy(err); + } else { + stream.respond({ [HTTP2_HEADER_STATUS]: 500 }); + stream.end(); + } + break; + case 'request': + const [, res] = args; + if (!res.headersSent && !res.finished) { + // Don't leak headers. + for (const name of res.getHeaderNames()) { + res.removeHeader(name); + } + res.statusCode = 500; + res.end(http.STATUS_CODES[500]); + } else { + res.destroy(); + } + break; + default: + net.Server.prototype[EventEmitter.captureRejectionSymbol] + .call(this, err, event, ...args); + } +}; + function setupCompat(ev) { if (ev === 'request') { this.removeListener('newListener', setupCompat); |