From 65c9ca62de57fc86dc66de120dcf252269542ffb Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Fri, 31 Oct 2025 09:39:16 +0100 Subject: [PATCH] Subscribe to more error events to prevent the process from crashing --- .../src/registryProxy/mitmRequestHandler.js | 23 +++++++++++++++++- .../src/registryProxy/plainHttpProxy.js | 9 +++++-- .../src/registryProxy/tunnelRequestHandler.js | 24 ++++++++++++------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/packages/safe-chain/src/registryProxy/mitmRequestHandler.js b/packages/safe-chain/src/registryProxy/mitmRequestHandler.js index 63a8168..e95bb62 100644 --- a/packages/safe-chain/src/registryProxy/mitmRequestHandler.js +++ b/packages/safe-chain/src/registryProxy/mitmRequestHandler.js @@ -37,13 +37,19 @@ function createHttpsServer(hostname, isAllowed) { forwardRequest(req, hostname, res); } - return https.createServer( + const server = https.createServer( { key: cert.privateKey, cert: cert.certificate, }, handleRequest ); + + server.on("error", (err) => { + ui.writeError(`Safe-chain: HTTPS server error: ${err.message}`); + }); + + return server; } function getRequestPathAndQuery(url) { @@ -62,6 +68,11 @@ function forwardRequest(req, hostname, res) { res.end("Bad Gateway"); }); + req.on("error", (err) => { + ui.writeError(`Safe-chain: Error reading client request: ${err.message}`); + proxyReq.destroy(); + }); + req.on("data", (chunk) => { proxyReq.write(chunk); }); @@ -88,6 +99,16 @@ function createProxyRequest(hostname, req, res) { } const proxyReq = https.request(options, (proxyRes) => { + proxyRes.on("error", (err) => { + ui.writeError( + `Safe-chain: Error reading upstream response: ${err.message}` + ); + if (!res.headersSent) { + res.writeHead(502); + res.end("Bad Gateway"); + } + }); + res.writeHead(proxyRes.statusCode, proxyRes.headers); proxyRes.pipe(res); }); diff --git a/packages/safe-chain/src/registryProxy/plainHttpProxy.js b/packages/safe-chain/src/registryProxy/plainHttpProxy.js index e337b44..ac3dc69 100644 --- a/packages/safe-chain/src/registryProxy/plainHttpProxy.js +++ b/packages/safe-chain/src/registryProxy/plainHttpProxy.js @@ -43,8 +43,13 @@ export function handleHttpProxyRequest(req, res) { } ) .on("error", (err) => { - res.writeHead(502); - res.end(`Bad Gateway: ${err.message}`); + if (!res.headersSent) { + res.writeHead(502); + res.end(`Bad Gateway: ${err.message}`); + } else { + // Headers already sent, just destroy the response + res.destroy(); + } }); req.on("error", () => { diff --git a/packages/safe-chain/src/registryProxy/tunnelRequestHandler.js b/packages/safe-chain/src/registryProxy/tunnelRequestHandler.js index c28a022..91b1c40 100644 --- a/packages/safe-chain/src/registryProxy/tunnelRequestHandler.js +++ b/packages/safe-chain/src/registryProxy/tunnelRequestHandler.js @@ -24,12 +24,6 @@ export function tunnelRequest(req, clientSocket, head) { function tunnelRequestToDestination(req, clientSocket, head) { const { port, hostname } = new URL(`http://${req.url}`); - clientSocket.on("error", () => { - // NO-OP - // This can happen if the client TCP socket sends RST instead of FIN. - // Not subscribing to 'close' event will cause node to throw and crash. - }); - const serverSocket = net.connect(port || 443, hostname, () => { clientSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n"); serverSocket.write(head); @@ -37,6 +31,14 @@ function tunnelRequestToDestination(req, clientSocket, head) { clientSocket.pipe(serverSocket); }); + clientSocket.on("error", () => { + // This can happen if the client TCP socket sends RST instead of FIN. + // Not subscribing to 'close' event will cause node to throw and crash. + if (serverSocket.writable) { + serverSocket.end(); + } + }); + serverSocket.on("error", (err) => { ui.writeError( `Safe-chain: error connecting to ${hostname}:${port} - ${err.message}` @@ -100,9 +102,13 @@ function tunnelRequestViaProxy(req, clientSocket, head, proxyUrl) { proxy.port || 8080 } - ${err.message}` ); - if (clientSocket.writable) { - clientSocket.end("HTTP/1.1 502 Bad Gateway\r\n\r\n"); - } + } else { + ui.writeError( + `Safe-chain: proxy socket error after connection - ${err.message}` + ); + } + if (clientSocket.writable) { + clientSocket.end("HTTP/1.1 502 Bad Gateway\r\n\r\n"); } });