From eeab2fd1534a12db4e2ee7996b58bc5de70f0172 Mon Sep 17 00:00:00 2001 From: Arnout Kazemier Date: Mon, 4 Oct 2010 21:10:02 +0200 Subject: [PATCH 1/2] Sometimes the listener.options is not available, and creates uncaught exception. This small if statement solves it. --- lib/socket.io/transports/websocket.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/socket.io/transports/websocket.js b/lib/socket.io/transports/websocket.js index 4219767a6f..ef96bb944a 100644 --- a/lib/socket.io/transports/websocket.js +++ b/lib/socket.io/transports/websocket.js @@ -115,7 +115,9 @@ WebSocket.prototype._proveReception = function(headers){ spaces = k.replace(/[^ ]/g, '').length; if (spaces === 0 || n % spaces !== 0){ - this.listener.options.log('Invalid WebSocket key: "' + k + '". Dropping connection'); + if(this.listener && this.listener.options){ + this.listener.options.log('Invalid WebSocket key: "' + k + '". Dropping connection'); + } this.connection.writeHead(500); this.connection.end(); return false; From e2bb868ed2e27718b9731ffb643f292f748ae579 Mon Sep 17 00:00:00 2001 From: Arnout Kazemier Date: Mon, 4 Oct 2010 21:21:53 +0200 Subject: [PATCH 2/2] Added error listeners, if theses errors are not correcly caught, they will leak memory. This caused http://speedo.no.de/ to go up from 1mb per connection after a ECONNECTRESET message --- lib/socket.io/listener.js | 29 +++++++++++++++++++++++++ lib/socket.io/transports/flashsocket.js | 6 +++++ 2 files changed, 35 insertions(+) diff --git a/lib/socket.io/listener.js b/lib/socket.io/listener.js index cea076af54..0daab97a3a 100644 --- a/lib/socket.io/listener.js +++ b/lib/socket.io/listener.js @@ -45,6 +45,18 @@ Listener = module.exports = function(server, options){ this.server.removeAllListeners('request'); this.server.addListener('request', function(req, res){ + req.addListener("error",function(err){ + console.log("Socket.io::request req error: " + JSON.stringify(err)); + req.end && req.end() || req.destroy && req.destroy(); + }); + res.addListener("error",function(err){ + console.log("Socket.io::request res error: " + JSON.stringify(err)); + res.end && res.end() || res.destroy && res.destroy(); + }); + req.socket.addListener("error",function(err){ + console.log("Socket.io::request req.socket error: " + JSON.stringify(err)); + req.socket && ( req.socket.end && req.socket.end() || req.socket.destroy && req.socket.destroy() ); + }); if (self.check(req, res)) return; for (var i = 0, len = listeners.length; i < len; i++){ listeners[i].call(this, req, res); @@ -52,11 +64,28 @@ Listener = module.exports = function(server, options){ }); this.server.addListener('upgrade', function(req, socket, head){ + req.addListener("error",function(err){ + console.log("Socket.io::upgrade req error: " + JSON.stringify(err)); + req.end && req.end() || req.destroy && req.destroy(); + }); + socket.addListener("error",function(err){ + console.log("Socket.io::upgrade socket error: " + JSON.stringify(err)); + socket.end && socket.end() || socket.destroy && socket.destroy(); + }); + req.socket.addListener("error",function(err){ + console.log("Socket.io::upgrade req.socket error: " + JSON.stringify(err)); + req.socket && ( req.socket.end && req.socket.end() || req.socket.destroy && req.socket.destroy() ); + }); + if (!self.check(req, socket, true, head)){ socket.destroy(); } }); + this.server.addListener('error', function(err){ + console.log("Socket.io::server global error: " + JSON.stringify(err)); + }); + for (var i in transports){ if ('init' in transports[i]) transports[i].init(this); } diff --git a/lib/socket.io/transports/flashsocket.js b/lib/socket.io/transports/flashsocket.js index 362ece0f5b..334a87e34d 100644 --- a/lib/socket.io/transports/flashsocket.js +++ b/lib/socket.io/transports/flashsocket.js @@ -22,6 +22,9 @@ Flashsocket.init = function(listener){ try { netserver = net.createServer(function(socket){ + socket.addListener("error",function(err){ + console.log("Socket.io::netserver request error: " + JSON.stringify(err)); socket.end && socket.end() || socket.destroy && socket.destroy(); + }); socket.write('\n'); socket.write('\n'); socket.write('\n'); @@ -36,6 +39,9 @@ try { socket.write('\n'); socket.end(); }); + netserver.addListener("error",function(err){ + console.log("Socket.io::netserver global error: " + JSON.stringify(err)); + }); netserver.listen(843); } catch(e){ if (e.errno == 13){