diff --git a/lib/tunnel/server.js b/lib/tunnel/server.js index 5c289af2..0196b6f5 100644 --- a/lib/tunnel/server.js +++ b/lib/tunnel/server.js @@ -268,6 +268,10 @@ TunnelServer.prototype._handleClient = function(client) { client.close(400, { error: err.message }); }) .on('data', function(data) { + if (ws.OPEN !== client.readyState) { + return cleanup(); + } + client.send(data, { binary: true }); }) .source(gateway); diff --git a/package.json b/package.json index d50d55e2..54f76217 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "storj", - "version": "2.0.3", + "version": "2.0.4", "description": "implementation of the storj protocol for node.js and the browser", "main": "index.js", "directories": { diff --git a/test/tunnel/server.unit.js b/test/tunnel/server.unit.js index 33ae798e..bdb93f9c 100644 --- a/test/tunnel/server.unit.js +++ b/test/tunnel/server.unit.js @@ -222,6 +222,30 @@ describe('TunnelServer', function() { badDemuxer.emit('data', { type: 'invalid' }); }); + it('should cleanup on muxer data if the client is closed', function(done) { + var muxer = new EventEmitter(); + muxer.source = sinon.stub(); + var client = new EventEmitter(); + client.upgradeReq = { url: 'ws://127.0.0.1:1337/tun?token=sometoken' }; + client.readyState = 0; + var MuxerStubTunServer = proxyquire('../../lib/tunnel/server', { + './multiplexer': function() { + return muxer; + } + }); + var ts = new MuxerStubTunServer({ server: http.Server() }); + ts._gateways.sometoken = new EventEmitter(); + ts._gateways.sometoken.close = sinon.stub(); + ts._handleClient(client); + setImmediate(function() { + muxer.emit('data', {}); + setImmediate(function() { + expect(ts._gateways.sometoken.close.called).to.equal(true); + done(); + }); + }); + }); + }); describe('#_getAvailablePort', function() {