diff --git a/lib/configproxy.js b/lib/configproxy.js index 7967527f..98663786 100644 --- a/lib/configproxy.js +++ b/lib/configproxy.js @@ -486,6 +486,14 @@ export class ConfigurableProxy extends EventEmitter { // socket-level error, no response to build return; } + if (kind === "ws") { + if (!res.writableEnded) { + // send empty http response with status + res.write(`HTTP/${req.httpVersion} ${code}\r\nContent-Length: 0\r\n\r\n`); + } + // http-proxy-3 calls res.destroySoon() after we return from here + return; + } if (this.errorTarget) { var urlSpec = new URL(this.errorTarget); // error request is $errorTarget/$code?url=$requestUrl @@ -497,9 +505,14 @@ export class ConfigurableProxy extends EventEmitter { var options = this.proxyOptsForTarget(urlSpec, req.url); options.method = "GET"; - var errorRequest = (options.secure ? https : http).request(url, options, function (upstream) { - if (res.writableEnded) return; // response already done - ["content-type", "content-encoding"].map(function (key) { + var errorRequest = (options.secure ? https : http).request(url, options, (upstream) => { + if (res.writableEnded) { + // response already done + // make sure to consume upstream; + upstream.resume(); + return; + } + ["content-type", "content-encoding"].map((key) => { if (!upstream.headers[key]) return; if (res.setHeader) res.setHeader(key, upstream.headers[key]); });