From ca1d12cf1bbfbe98b5159f9c02e2f6c818a1c749 Mon Sep 17 00:00:00 2001 From: indexzero Date: Thu, 8 Sep 2011 16:21:20 -0700 Subject: [PATCH] [fix] Memory leak hunting. --- lib/node-http-proxy.js | 8 ++++++++ lib/node-http-proxy/http-proxy.js | 18 +++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/node-http-proxy.js b/lib/node-http-proxy.js index 561dad0..02aae9c 100644 --- a/lib/node-http-proxy.js +++ b/lib/node-http-proxy.js @@ -174,6 +174,14 @@ exports.buffer = function (obj) { obj.removeListener('data', onData); obj.removeListener('end', onEnd); }, + destroy: function () { + this.end(); + this.resume = function () { + console.error("Cannot resume buffer after destroying it."); + }; + + onData = onEnd = events = obj = null; + }, resume: function () { this.end(); for (var i = 0, len = events.length; i < len; ++i) { diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index f6822b3..4ccbcab 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -279,9 +279,13 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { } }); + // // If we have been passed buffered data, resume it. - if (buffer && !errState) { - buffer.resume(); + // + if (buffer) { + return !errState + ? buffer.resume() + : buffer.destroy(); } }; @@ -419,6 +423,7 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, buffer) reverseProxy.incoming.socket.write(data); } catch (ex) { + detach(); reverseProxy.incoming.socket.end(); proxySocket.end(); } @@ -429,12 +434,13 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, buffer) // Any outgoing data on this Websocket from the proxy target // will be written to the `proxySocket` socket. // - reverseProxy.incoming.socket.on('data', listeners.onOutgoing = function(data) { + reverseProxy.incoming.socket.on('data', listeners.onOutgoing = function (data) { try { self.emit('websocket:incoming', reverseProxy, reverseProxy.incoming, head, data); proxySocket.write(data); } catch (ex) { + detach(); proxySocket.end(); socket.end(); } @@ -625,7 +631,9 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, buffer) // // If we have been passed buffered data, resume it. // - if (buffer && !errState) { - buffer.resume(); + if (buffer) { + return !errState + ? buffer.resume() + : buffer.destroy(); } };