From 4c3ba74c4e99f03eed84f4d34844870845d96790 Mon Sep 17 00:00:00 2001 From: David Glasser Date: Wed, 22 Jan 2014 15:40:40 -0800 Subject: [PATCH] Close outgoing ws if incoming ws emits error Fixes #559, which contains a full reproduction recipe. --- lib/http-proxy/passes/ws-incoming.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/http-proxy/passes/ws-incoming.js b/lib/http-proxy/passes/ws-incoming.js index a9e8797..7673fe0 100644 --- a/lib/http-proxy/passes/ws-incoming.js +++ b/lib/http-proxy/passes/ws-incoming.js @@ -88,10 +88,16 @@ var passes = exports; common.setupOutgoing(options.ssl || {}, options, req) ); // Error Handler - proxyReq.on('error', onError); + proxyReq.on('error', onOutgoingError); proxyReq.on('upgrade', function(proxyRes, proxySocket, proxyHead) { - proxySocket.on('error', onError); + proxySocket.on('error', onOutgoingError); + // The pipe below will end proxySocket if socket closes cleanly, but not + // if it errors (eg, vanishes from the net and starts returning + // EHOSTUNREACH). We need to do that explicitly. + socket.on('error', function () { + proxySocket.end(); + }); common.setupSocket(proxySocket); @@ -106,7 +112,7 @@ var passes = exports; return proxyReq.end(); // XXX: CHECK IF THIS IS THIS CORRECT - function onError(err) { + function onOutgoingError(err) { if (clb) { clb(err, req, socket); } else {