Skip to content

Commit f3fd4bb

Browse files
committed
Merge pull request #344 from nkzawa/patch-6
Fix sockets can stay open when upgrade failed
2 parents 7b1d4cb + deb7ae4 commit f3fd4bb

File tree

2 files changed

+47
-9
lines changed

2 files changed

+47
-9
lines changed

lib/server.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,14 @@ Server.prototype.onWebSocket = function(req, socket){
334334
req.websocket = socket;
335335

336336
if (id) {
337-
if (!this.clients[id]) {
337+
var client = this.clients[id];
338+
if (!client) {
338339
debug('upgrade attempt for closed client');
339340
socket.close();
340-
} else if (this.clients[id].upgraded) {
341+
} else if (client.upgrading) {
342+
debug('transport has already been trying to upgrade');
343+
socket.close();
344+
} else if (client.upgraded) {
341345
debug('transport had already been upgraded');
342346
socket.close();
343347
} else {
@@ -348,7 +352,7 @@ Server.prototype.onWebSocket = function(req, socket){
348352
} else {
349353
transport.supportsBinary = true;
350354
}
351-
this.clients[id].maybeUpgrade(transport);
355+
client.maybeUpgrade(transport);
352356
}
353357
} else {
354358
this.handshake(req._query.transport, req);

lib/socket.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module.exports = Socket;
2020
function Socket (id, server, transport, req) {
2121
this.id = id;
2222
this.server = server;
23+
this.upgrading = false;
2324
this.upgraded = false;
2425
this.readyState = 'opening';
2526
this.writeBuffer = [];
@@ -161,13 +162,14 @@ Socket.prototype.maybeUpgrade = function (transport) {
161162
debug('might upgrade socket transport from "%s" to "%s"'
162163
, this.transport.name, transport.name);
163164

165+
this.upgrading = true;
166+
164167
var self = this;
165168

166169
// set transport upgrade timer
167170
self.upgradeTimeoutTimer = setTimeout(function () {
168171
debug('client did not complete upgrade - closing transport');
169-
clearInterval(self.checkIntervalTimer);
170-
self.checkIntervalTimer = null;
172+
cleanup();
171173
if ('open' == transport.readyState) {
172174
transport.close();
173175
}
@@ -180,22 +182,20 @@ Socket.prototype.maybeUpgrade = function (transport) {
180182
self.checkIntervalTimer = setInterval(check, 100);
181183
} else if ('upgrade' == packet.type && self.readyState != 'closed') {
182184
debug('got upgrade packet - upgrading');
185+
cleanup();
183186
self.upgraded = true;
184187
self.clearTransport();
185188
self.setTransport(transport);
186189
self.emit('upgrade', transport);
187190
self.setPingTimeout();
188191
self.flush();
189-
clearInterval(self.checkIntervalTimer);
190-
self.checkIntervalTimer = null;
191-
clearTimeout(self.upgradeTimeoutTimer);
192-
transport.removeListener('packet', onPacket);
193192
if (self.readyState == 'closing') {
194193
transport.close(function () {
195194
self.onClose('forced close');
196195
});
197196
}
198197
} else {
198+
cleanup();
199199
transport.close();
200200
}
201201
}
@@ -208,7 +208,41 @@ Socket.prototype.maybeUpgrade = function (transport) {
208208
}
209209
}
210210

211+
function cleanup() {
212+
self.upgrading = false;
213+
214+
clearInterval(self.checkIntervalTimer);
215+
self.checkIntervalTimer = null;
216+
217+
clearTimeout(self.upgradeTimeoutTimer);
218+
self.upgradeTimeoutTimer = null;
219+
220+
transport.removeListener('packet', onPacket);
221+
transport.removeListener('close', onTransportClose);
222+
transport.removeListener('error', onError);
223+
self.removeListener('close', onClose);
224+
}
225+
226+
function onError(err) {
227+
debug('client did not complete upgrade - %s', err);
228+
cleanup();
229+
transport.close();
230+
transport = null;
231+
}
232+
233+
function onTransportClose(){
234+
onError("transport closed");
235+
}
236+
237+
function onClose() {
238+
onError("socket closed");
239+
}
240+
211241
transport.on('packet', onPacket);
242+
transport.once('close', onTransportClose);
243+
transport.once('error', onError);
244+
245+
self.once('close', onClose);
212246
};
213247

214248
/**

0 commit comments

Comments
 (0)