summaryrefslogtreecommitdiff
path: root/lib/internal/http2
diff options
context:
space:
mode:
authorMatteo Collina <hello@matteocollina.com>2019-10-02 13:02:37 +0200
committerMatteo Collina <hello@matteocollina.com>2019-12-03 12:14:56 +0100
commit415bba752ffcdc28ccae6cdf567e739be77ad6f9 (patch)
tree8d2cc1b4565abda6c709ba271ad4f55511dfa93d /lib/internal/http2
parented8619899735df53f9463bac0b10524f3c15a218 (diff)
downloadandroid-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.js45
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);