Compare commits

...

42 Commits
0.8.6 ... 0.8.7

Author SHA1 Message Date
Guillermo Rauch
3ed6b79781 Release 0.8.7 2011-11-05 13:50:53 -07:00
Guillermo Rauch
946418e70e Merge pull request #621 from einaros/master
Deals with a memleak in namespaces, and silently drops malformed websocket connections
2011-11-02 15:11:21 -07:00
Guillermo Rauch
2bb60ac40b Merge pull request #616 from thekiur/master
This patch will prevent some random memory leaking.
2011-11-02 11:25:19 -07:00
TJ Holowaychuk
e20777d21d Merge pull request #617 from sutiam/patch-2
add semicolon
2011-11-01 17:33:08 -07:00
sutiam
311ef7e7e7 add semicolon 2011-11-01 17:26:33 -07:00
thekiur
9e92075cbb Removed useless object: closedA, probably fixed a memory leak 2011-11-01 23:31:58 +02:00
einaros
63043b3d5d fixes leak #608 2011-10-31 22:47:25 +01:00
einaros
92a3cce272 circumvents #602 .. although only a horribly malformed websocket connection could potentially cause this 2011-10-28 14:04:55 +02:00
Guillermo Rauch
8339c96e84 Merge pull request #596 from einaros/nodenext
Node v0.5+ compatibility
2011-10-28 01:30:18 -07:00
einaros
a125fcb1a4 further updates to chat example dependencies 2011-10-28 10:18:47 +02:00
einaros
97f634f18f further updates to irc example dependencies 2011-10-28 10:18:08 +02:00
einaros
82266cf202 updated stylus dependency in examples to node 0.5+ compatible version 2011-10-28 10:14:26 +02:00
einaros
be94641651 fixed irc example for nodenext 2011-10-28 10:12:52 +02:00
einaros
703d1d778e fixed chat example for nodenext 2011-10-28 10:10:45 +02:00
einaros
70c61fa84d Merge remote branch 'upstream/master' into nodenext 2011-10-28 10:10:26 +02:00
einaros
3a07cc29bd added return for clarity 2011-10-26 08:21:22 +02:00
einaros
89a5134b66 corrected whitespace 2011-10-25 23:46:36 +02:00
einaros
6ca42fdc8f well thats five minutes of my life ill never get back. thanks. 2011-10-25 22:53:37 +02:00
einaros
a9f81a59c2 ensure backwards compatibility 2011-10-25 22:12:55 +02:00
einaros
8a90bf5234 re-enabled flashsocket tests, after bugfixes in flashsocket transport 2011-10-25 21:26:57 +02:00
einaros
357a9cb870 fixed race condition and scoping bug 2011-10-25 21:25:44 +02:00
einaros
8253ed573a ignore exception on port change 2011-10-25 19:47:39 +02:00
einaros
3f55d82bf7 added node v4 client closing compatibility 2011-10-25 13:30:06 +02:00
einaros
08467d4e12 temporarily disabled flash policy server tests 2011-10-25 13:19:39 +02:00
einaros
cb70f7873f moved default error handler 2011-10-25 13:18:40 +02:00
einaros
57b0ce73c7 resolve race condition 2011-10-25 13:09:04 +02:00
einaros
25f97431d4 set nodelay 2011-10-25 13:08:49 +02:00
einaros
f931af5758 fixed xhr-polling tests, in a way similar to jsonp 2011-10-25 10:45:20 +02:00
einaros
c88ea9ed61 fixed websocket testing, removed seemingly irrelevant tests 2011-10-25 10:42:18 +02:00
einaros
2bdee1b28f use new agent 2011-10-25 10:41:58 +02:00
einaros
a1f0b6c361 manager tests now pass properly 2011-10-24 21:26:15 +02:00
einaros
c1e64b90a4 added warning message from default error event handler 2011-10-23 23:03:23 +02:00
einaros
79c3d84a98 circumvent race condition due to changed http bits in 0.5 2011-10-23 14:21:22 +02:00
einaros
f6c376d087 another stab at proper 0.5 agent socket closing 2011-10-23 14:20:21 +02:00
einaros
bc15077ecc further checks to not close sockets that aren't there 2011-10-23 14:14:48 +02:00
einaros
28bf55e572 patched a few compatibility issues in node-websocket-server 2011-10-23 00:43:07 +02:00
einaros
f213d69e17 check that there's actually a socket to close 2011-10-22 14:39:59 +02:00
einaros
aa6f228ccf updated to use NODE_PATH rather than old expresso include argument 2011-10-22 14:39:33 +02:00
einaros
553b9e9d68 updated test to work with 0.5 2011-10-22 13:30:30 +02:00
einaros
ec6e43d7ee updated expresso dep 2011-10-22 13:30:12 +02:00
einaros
48140cf8a0 node 0.5 way of closing agent sockets 2011-10-22 13:29:57 +02:00
einaros
796bc9e95b capture error emitted by the server, which happens a lot with node 0.5+ 2011-10-22 13:28:54 +02:00
25 changed files with 157 additions and 257 deletions

View File

@@ -1,4 +1,13 @@
0.8.7 / 2011-11-05
==================
* Fixed memory leaks in closed clients.
* Fixed memory leaks in namespaces.
* Fixed websocket handling for malformed requests from proxies. [einaros]
* Node 0.6 compatibility. [einaros] [3rd-Eden]
* Adapted tests and examples.
0.8.6 / 2011-10-27
==================

View File

@@ -6,13 +6,12 @@ run-tests:
@./node_modules/.bin/expresso \
-t 3000 \
-I support \
-I lib \
--serial \
$(TESTFLAGS) \
$(TESTS)
test:
@$(MAKE) TESTS="$(ALL_TESTS)" run-tests
@$(MAKE) NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
test-cov:
@TESTFLAGS=--cov $(MAKE) test

View File

@@ -1,10 +1,3 @@
/**
* Bootstrap app.
*/
require.paths.unshift(__dirname + '/../../lib/');
/**
* Module dependencies.
*/
@@ -12,7 +5,7 @@ require.paths.unshift(__dirname + '/../../lib/');
var express = require('express')
, stylus = require('stylus')
, nib = require('nib')
, sio = require('socket.io');
, sio = require('../../lib/socket.io');
/**
* App.
@@ -25,7 +18,7 @@ var app = express.createServer();
*/
app.configure(function () {
app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }))
app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }));
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname);
app.set('view engine', 'jade');

View File

@@ -3,9 +3,9 @@
, "description": "example chat application with socket.io"
, "version": "0.0.1"
, "dependencies": {
"express": "2.3.11"
, "jade": "0.12.1"
, "stylus": "0.13.3"
, "nib": "0.0.8"
"express": "2.5.0"
, "jade": "0.16.4"
, "stylus": "0.19.0"
, "nib": "0.2.0"
}
}

View File

@@ -1,10 +1,3 @@
/**
* Bootstrap app.
*/
require.paths.unshift(__dirname + '/../../lib/');
/**
* Module dependencies.
*/
@@ -12,7 +5,7 @@ require.paths.unshift(__dirname + '/../../lib/');
var express = require('express')
, stylus = require('stylus')
, nib = require('nib')
, sio = require('socket.io')
, sio = require('../../lib/socket.io')
, irc = require('./irc');
/**

View File

@@ -2,7 +2,7 @@
* From https://github.com/felixge/nodelog/
*/
var sys = require('sys');
var sys = require('util');
var tcp = require('net');
var irc = exports;

View File

@@ -2,9 +2,9 @@
"name": "socket.io-irc"
, "version": "0.0.1"
, "dependencies": {
"express": "2.3.11"
, "jade": "0.12.1"
, "stylus": "0.13.3"
, "nib": "0.0.8"
"express": "2.5.0"
, "jade": "0.16.4"
, "stylus": "0.19.0"
, "nib": "0.2.0"
}
}

View File

@@ -93,6 +93,11 @@ function Manager (server, options) {
var self = this;
// default error handler
server.on('error', function(err) {
self.log.warn('error raised: ' + err);
});
this.initStore();
this.on('set:store', function() {
@@ -262,7 +267,6 @@ Manager.prototype.initStore = function () {
this.connected = {};
this.open = {};
this.closed = {};
this.closedA = [];
this.rooms = {};
this.roomClients = {};
@@ -334,8 +338,6 @@ Manager.prototype.onOpen = function (id) {
if (this.closed[id]) {
var self = this;
this.closedA.splice(this.closedA.indexOf(id), 1);
this.store.unsubscribe('dispatch:' + id, function () {
delete self.closed[id];
});
@@ -424,7 +426,6 @@ Manager.prototype.onClose = function (id) {
}
this.closed[id] = [];
this.closedA.push(id);
var self = this;
@@ -467,9 +468,7 @@ Manager.prototype.onClientMessage = function (id, packet) {
Manager.prototype.onClientDisconnect = function (id, reason) {
for (var name in this.namespaces) {
if (this.roomClients[id][name]) {
this.namespaces[name].handleDisconnect(id, reason);
}
this.namespaces[name].handleDisconnect(id, reason, typeof this.roomClients[id][name] !== 'undefined');
}
this.onDisconnect(id);
@@ -499,7 +498,6 @@ Manager.prototype.onDisconnect = function (id, local) {
if (this.closed[id]) {
delete this.closed[id];
this.closedA.splice(this.closedA.indexOf(id), 1);
}
if (this.roomClients[id]) {

View File

@@ -224,9 +224,9 @@ SocketNamespace.prototype.authorization = function (fn) {
* @api private
*/
SocketNamespace.prototype.handleDisconnect = function (sid, reason) {
SocketNamespace.prototype.handleDisconnect = function (sid, reason, raiseOnDisconnect) {
if (this.sockets[sid] && this.sockets[sid].readable) {
this.sockets[sid].onDisconnect(reason);
if (raiseOnDisconnect) this.sockets[sid].onDisconnect(reason);
delete this.sockets[sid];
}
};

View File

@@ -15,7 +15,7 @@ var client = require('socket.io-client');
* Version.
*/
exports.version = '0.8.6';
exports.version = '0.8.7';
/**
* Supported protocol version.

View File

@@ -49,9 +49,9 @@ FlashSocket.prototype.name = 'flashsocket';
* @api private
*/
var server;
FlashSocket.init = function (manager) {
var server;
function create () {
server = require('policyfile').createServer({
log: function(msg){
@@ -80,10 +80,15 @@ FlashSocket.init = function (manager) {
// destory the server and create a new server
manager.on('set:flash policy port', function (value, key) {
var transports = manager.get('transports');
if (server && server.port !== value && ~transports.indexOf('flashsocket')) {
// destroy the server and rebuild it on a new port
server.close();
if (~transports.indexOf('flashsocket')) {
if (server) {
if (server.port === value) return;
// destroy the server and rebuild it on a new port
try {
server.close();
}
catch (e) { /* ignore exception. could e.g. be that the server isn't started yet */ }
}
create();
}
});
@@ -94,7 +99,6 @@ FlashSocket.init = function (manager) {
create();
}
});
// check if we need to initialize at start
if (~manager.get('transports').indexOf('flashsocket')){
create();

View File

@@ -91,7 +91,8 @@ WebSocket.prototype.protocolVersion = '07-12';
WebSocket.prototype.onSocketConnect = function () {
var self = this;
if (this.req.headers.upgrade.toLowerCase() !== 'websocket') {
if (typeof this.req.headers.upgrade === 'undefined' ||
this.req.headers.upgrade.toLowerCase() !== 'websocket') {
this.log.warn(this.name + ' connection invalid');
this.end();
return;

View File

@@ -91,7 +91,8 @@ WebSocket.prototype.protocolVersion = '16';
WebSocket.prototype.onSocketConnect = function () {
var self = this;
if (this.req.headers.upgrade.toLowerCase() !== 'websocket') {
if (typeof this.req.headers.upgrade === 'undefined' ||
this.req.headers.upgrade.toLowerCase() !== 'websocket') {
this.log.warn(this.name + ' connection invalid');
this.end();
return;

View File

@@ -1,6 +1,6 @@
{
"name": "socket.io"
, "version": "0.8.6"
, "version": "0.8.7"
, "description": "Real-time apps made cross-browser & easy with a WebSocket-like API"
, "homepage": "http://socket.io"
, "keywords": ["websocket", "socket", "realtime", "socket.io", "comet", "ajax"]
@@ -16,12 +16,12 @@
, "url": "https://github.com/LearnBoost/socket.io.git"
}
, "dependencies": {
"socket.io-client": "0.8.6"
"socket.io-client": "0.8.7"
, "policyfile": "0.0.4"
, "redis": "0.6.7"
}
, "devDependencies": {
"expresso": "0.7.7"
"expresso": "0.9.2"
, "should": "0.0.4"
, "assertvanish": "0.0.3-1"
, "benchmark": "0.2.2"

View File

@@ -5,7 +5,7 @@ var events = require('events');
var http = require('http');
var net = require('net');
var urllib = require('url');
var sys = require('sys');
var sys = require('util');
var FRAME_NO = 0;
var FRAME_LO = 1;
@@ -347,7 +347,6 @@ var WebSocket = function(url, proto, opts) {
// that we've closed.
var finishClose = self.finishClose = function() {
readyState = CLOSED;
if (stream) {
stream.end();
stream.destroy();
@@ -469,29 +468,45 @@ var WebSocket = function(url, proto, opts) {
// that http.Client passes its constructor arguments through,
// un-inspected to net.Stream.connect(). The latter accepts a
// string as its first argument to connect to a UNIX socket.
var httpClient = undefined;
var opt = {};
var agent = null;
switch (getUrlScheme(url)) {
case 'ws':
var u = urllib.parse(url);
httpClient = http.createClient(u.port || 80, u.hostname);
httpPath = (u.pathname || '/') + (u.search || '');
httpHeaders.Host = u.hostname + (u.port ? (":" + u.port) : "");
agent = new http.Agent({
host: u.hostname,
port: u.port || 80
});
opt.agent = agent;
opt.host = u.hostname;
opt.port = u.port || 80;
opt.path = (u.pathname || '/') + (u.search || '');
opt.headers = httpHeaders;
break;
case 'ws+unix':
var sockPath = url.substring('ws+unix://'.length, url.length);
httpClient = http.createClient(sockPath);
httpHeaders.Host = 'localhost';
var u = urllib.parse(url);
agent = new http.Agent({
host: 'localhost',
port: sockPath
});
opt.agent = agent;
opt.host = 'localhost';
opt.path = sockPath;
opt.headers = httpHeaders;
break;
default:
throw new Error('Invalid URL scheme \'' + urlScheme + '\' specified.');
}
httpClient.on('upgrade', (function() {
var httpReq = http.request(opt, function() { });
var upgradeHandler = (function() {
var data = undefined;
return function(req, s, head) {
req.socket.setNoDelay(true);
stream = s;
if (readyState == CLOSED) {
@@ -554,7 +569,7 @@ var WebSocket = function(url, proto, opts) {
//
// XXX: This is lame. We should only remove the listeners
// that we added.
httpClient.removeAllListeners('upgrade');
httpReq.removeAllListeners('upgrade');
stream.removeAllListeners('data');
stream.on('data', dataListener);
@@ -582,13 +597,9 @@ var WebSocket = function(url, proto, opts) {
stream.emit('data', head);
};
})());
httpClient.on('error', function(e) {
httpClient.end();
errorListener(e);
});
var httpReq = httpClient.request(httpPath, httpHeaders);
})();
agent.on('upgrade', upgradeHandler); // node v0.4
httpReq.on('upgrade', upgradeHandler); // node v0.5+
httpReq.write(challenge, 'binary');
httpReq.end();

View File

@@ -91,8 +91,21 @@ HTTPClient.prototype.request = function (path, opts, fn) {
*/
HTTPClient.prototype.end = function () {
this.agent.sockets.forEach(function (socket) {
socket.end();
// node <v0.5 compat
if (this.agent.sockets.forEach) {
this.agent.sockets.forEach(function (socket) {
if (socket.end) socket.end();
});
return;
}
// node >=v0.5 compat
var self = this;
Object.keys(this.agent.sockets).forEach(function (socket) {
for (var i = 0, l = self.agent.sockets[socket].length; i < l; ++i) {
if (self.agent.sockets[socket][i]._handle) {
self.agent.sockets[socket][i]._handle.socket.end();
}
}
});
};

View File

@@ -55,16 +55,16 @@ mask = function(buf, maskString) {
getHybiLengthAsHexString = function(len, masked) {
if (len < 126) {
var buf = new Buffer(1);
buf[0] = (masked ? 0x80 : 0) | len;
buf[0] = (masked ? 0x80 : 0) | len;
}
else if (len < 65536) {
var buf = new Buffer(3);
buf[0] = (masked ? 0x80 : 0) | 126;
buf[0] = (masked ? 0x80 : 0) | 126;
getBufferFromHexString(pack(4, len)).copy(buf, 1);
}
else {
var buf = new Buffer(9);
buf[0] = (masked ? 0x80 : 0) | 127;
buf[0] = (masked ? 0x80 : 0) | 127;
getBufferFromHexString(pack(16, len)).copy(buf, 1);
}
return getHexStringFromBuffer(buf);

View File

@@ -116,10 +116,10 @@ module.exports = {
io.server.close();
done();
});
done();
} catch (e) {
e.should.match(/EACCES/);
done();
}
}
};

View File

@@ -117,6 +117,7 @@ module.exports = {
io.disable('foo');
calls.should.eql(3);
done();
},
@@ -426,8 +427,8 @@ module.exports = {
'test disabling heartbeats': function (done) {
var port = ++ports
, io = sio.listen(port)
, cl = client(port)
, io = create(cl)
, messages = 0
, beat = false
, ws;
@@ -446,9 +447,8 @@ module.exports = {
socket.on('disconnect', function (reason) {
beat.should.be.false;
cl.end();
ws.finishClose();
cl.end();
io.server.close();
done();
});
@@ -505,8 +505,10 @@ module.exports = {
io.rooms.foo.length.should.equal(2);
io.rooms.bar.length.should.equal(2);
io.server.close();
done();
process.nextTick(function() {
io.server.close();
done();
});
},
'test passing options directly to the Manager through listen': function (done) {
@@ -515,8 +517,10 @@ module.exports = {
io.get('resource').should.equal('/my resource');
io.get('custom').should.equal('opt');
io.server.close();
done();
process.nextTick(function() {
io.server.close();
done();
});
},
'test disabling the log': function (done) {
@@ -535,8 +539,10 @@ module.exports = {
console.log = _console;
calls.should.equal(0);
io.server.close();
done();
process.nextTick(function() {
io.server.close();
done();
});
},
'test disabling logging with colors': function (done) {
@@ -558,7 +564,9 @@ module.exports = {
console.log = _console;
calls.should.equal(2);
io.server.close();
done();
process.nextTick(function() {
io.server.close();
done();
});
}
};

View File

@@ -131,7 +131,7 @@ module.exports = {
if (data.endpoint == '/a') {
data.type.should.eql('error');
data.reason.should.eql('unauthorized')
cl.end();
ws.finishClose();
io.server.close()
@@ -154,6 +154,9 @@ module.exports = {
io.of('a')
.on('connection', function (socket){
if (connect < 2) {
return;
}
socket.broadcast.emit('b', 'test');
socket.broadcast.json.emit('json', {foo:'bar'});
socket.broadcast.send('foo');
@@ -163,7 +166,6 @@ module.exports = {
connect.should.equal(2);
message.should.equal(1);
events.should.equal(2);
cl.end();
ws1.finishClose();
ws2.finishClose();
@@ -173,16 +175,19 @@ module.exports = {
cl.handshake(function (sid) {
ws1 = websocket(cl, sid);
ws1.on('open', function() {
ws1.packet({
type: 'connect'
, endpoint: 'a'
});
});
ws1.on('message', function (data) {
if (data.type === 'connect') {
if (connect == 0) {
cl.handshake(function (sid) {
ws2 = websocket(cl, sid);
ws2.on('open', function () {
ws2.packet({
type: 'connect'
, endpoint: 'a'
});
});
});
}
++connect;
if (++calls === expected) finish();
}
@@ -197,17 +202,12 @@ module.exports = {
if (++calls === expected) finish();
}
});
cl.handshake(function (sid) {
ws2 = websocket(cl, sid);
ws2.on('open', function () {
ws2.packet({
type: 'connect'
, endpoint: 'a'
});
ws1.on('open', function() {
ws1.packet({
type: 'connect'
, endpoint: 'a'
});
})
});
})
},

View File

@@ -1,15 +0,0 @@
/**
* Test dependencies.
*/
var sio = require('socket.io')
, should = require('./common');
/**
* Test.
*/
module.exports = {
};

View File

@@ -30,8 +30,10 @@ module.exports = {
(!!io.static.has('/static/flashsocket/WebSocketMain.swf')).should.be.true;
(!!io.static.has('/static/flashsocket/WebSocketMainInsecure.swf')).should.be.true;
io.server.close();
done();
process.nextTick(function() {
io.server.close();
done();
});
},
'test that static files are correctly looked up': function (done) {
@@ -41,8 +43,10 @@ module.exports = {
(!!io.static.has('/socket.io.js')).should.be.true;
(!!io.static.has('/invalidfilehereplease.js')).should.be.false;
io.server.close();
done();
process.nextTick(function() {
io.server.close();
done();
});
},
'test that the client is served': function (done) {

View File

@@ -250,8 +250,7 @@ module.exports = {
});
},
'test the disconnection event when the client sends ?disconnect req':
function (done) {
'test the disconnection event when the client sends ?disconnect req': function (done) {
var cl = client(++ports)
, io = create(cl)
, disconnected = false
@@ -279,12 +278,17 @@ module.exports = {
msgs.should.have.length(1);
msgs[0].should.eql({ type: 'disconnect', endpoint: '' });
disconnected.should.be.true;
cl.end();
io.server.close();
cl.end();
done();
});
cl.get('/socket.io/{protocol}/jsonp-polling/' + sid + '/?disconnect');
// with the new http bits in node 0.5, there's no guarantee that
// the previous request is actually dispatched (and received) before the following
// reset call is sent. to not waste more time on a workaround, a timeout is added.
setTimeout(function() {
cl.get('/socket.io/{protocol}/jsonp-polling/' + sid + '/?disconnect');
}, 500);
});
});
},

View File

@@ -236,140 +236,12 @@ module.exports = {
});
},
'test sending undeliverable volatile messages': function (done) {
var cl = client(++ports)
, io = create(cl)
, messages = 0
, messaged = false
, s;
io.configure(function () {
io.set('close timeout', .05);
});
io.sockets.on('connection', function (socket) {
s = socket;
socket.on('disconnect', function () {
messaged.should.be.false;
cl.end();
io.server.close();
done();
});
});
cl.handshake(function (sid) {
var ws = websocket(cl, sid);
ws.on('message', function (msg) {
msg.type.should.eql('connect');
ws.finishClose();
setTimeout(function () {
s.volatile.send('ah wha wha');
ws = websocket(cl, sid);
ws.on('message', function () {
messaged = true;
});
setTimeout(function () {
ws.finishClose();
}, 10);
}, 10);
});
});
},
'test sending undeliverable volatile json': function (done) {
var cl = client(++ports)
, io = create(cl)
, messaged = false
, s;
io.configure(function () {
io.set('close timeout', .05);
});
io.sockets.on('connection', function (socket) {
s = socket;
socket.on('disconnect', function () {
messaged.should.be.false;
cl.end();
io.server.close();
done();
});
});
cl.handshake(function (sid) {
var ws = websocket(cl, sid);
ws.on('message', function () {
ws.finishClose();
setTimeout(function () {
s.volatile.json.send({ a: 'b' });
ws = websocket(cl, sid);
ws.on('message', function () {
messaged = true;
});
setTimeout(function () {
ws.finishClose();
}, 10);
}, 10);
});
});
},
'test sending undeliverable volatile events': function (done) {
var cl = client(++ports)
, io = create(cl)
, messaged = false
, s;
io.configure(function () {
io.set('close timeout', .05);
});
io.sockets.on('connection', function (socket) {
s = socket;
socket.on('disconnect', function () {
messaged.should.be.false;
cl.end();
io.server.close();
done();
});
});
cl.handshake(function (sid) {
var ws = websocket(cl, sid);
ws.on('message', function () {
ws.finishClose();
setTimeout(function () {
s.volatile.emit({ a: 'b' });
ws = websocket(cl, sid);
ws.on('message', function () {
messaged = true;
});
setTimeout(function () {
ws.finishClose();
}, 10);
}, 10);
});
});
},
'test sending deliverable volatile messages': function (done) {
var cl = client(++ports)
, io = create(cl)
, messages = 0
, messaged = false;
io.configure(function () {
io.set('close timeout', .05);
});

View File

@@ -220,7 +220,12 @@ module.exports = {
done();
});
cl.get('/socket.io/{protocol}/xhr-polling/' + sid + '/?disconnect');
// with the new http bits in node 0.5, there's no guarantee that
// the previous request is actually dispatched (and received) before the following
// reset call is sent. to not waste more time on a workaround, a timeout is added.
setTimeout(function() {
cl.get('/socket.io/{protocol}/xhr-polling/' + sid + '/?disconnect');
}, 500);
});
});
},