Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 28 additions & 16 deletions lib/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ var EventEmitter = require('events').EventEmitter;
var Socket = require('./socket');
var util = require('util');
var debug = require('debug')('engine');
var debugError = require('debug')('engine:error');
var cookieMod = require('cookie');

/**
Expand Down Expand Up @@ -150,23 +151,27 @@ Server.prototype.verify = function (req, upgrade, fn) {
// transport check
var transport = req._query.transport;
if (!~this.transports.indexOf(transport)) {
debug('unknown transport "%s"', transport);
debugError('unknown transport "%s"', transport);
return fn(Server.errors.UNKNOWN_TRANSPORT, false);
}

// sid check
var sid = req._query.sid;
if (sid) {
if (!this.clients.hasOwnProperty(sid)) {
debugError('unknown sid [%s] for transport "%s"', sid, transport);
return fn(Server.errors.UNKNOWN_SID, false);
}
if (!upgrade && this.clients[sid].transport.name !== transport) {
debug('bad request: unexpected transport without upgrade');
debugError('bad request: unexpected transport "%s" without upgrade', transport);
return fn(Server.errors.BAD_REQUEST, false);
}
} else {
// handshake is GET only
if ('GET' !== req.method) return fn(Server.errors.BAD_HANDSHAKE_METHOD, false);
if ('GET' !== req.method) {
debugError('wrong request method [%s] for transport "%s"', req.method, transport);
return fn(Server.errors.BAD_HANDSHAKE_METHOD, false);
}
if (!this.allowRequest) return fn(null, true);
return this.allowRequest(req, fn);
}
Expand Down Expand Up @@ -310,6 +315,7 @@ Server.prototype.handshake = function (transportName, req) {
transport.supportsBinary = true;
}
} catch (e) {
debugError('failed to create transport %s : %O', transportName, e);
sendErrorMessage(req, req.res, Server.errors.BAD_REQUEST);
return;
}
Expand Down Expand Up @@ -377,7 +383,7 @@ Server.prototype.onWebSocket = function (req, socket) {
socket.on('error', onUpgradeError);

if (!transports[req._query.transport].prototype.handlesUpgrades) {
debug('transport doesnt handle upgraded requests');
debugError('transport "%s" does not handle upgraded requests', req._query.transport);
socket.close();
return;
}
Expand All @@ -391,28 +397,34 @@ Server.prototype.onWebSocket = function (req, socket) {
if (id) {
var client = this.clients[id];
if (!client) {
debug('upgrade attempt for closed client');
debugError('upgrade attempt for closed client: %s', id);
socket.close();
} else if (client.upgrading) {
debug('transport has already been trying to upgrade');
debugError('transport has already been trying to upgrade for client [%s]', id);
socket.close();
} else if (client.upgraded) {
debug('transport had already been upgraded');
debugError('transport had already been upgraded for client [%s]', id);
socket.close();
} else {
debug('upgrading existing transport');

// transport error handling takes over
socket.removeListener('error', onUpgradeError);

var transport = new transports[req._query.transport](req);
if (req._query && req._query.b64) {
transport.supportsBinary = false;
} else {
transport.supportsBinary = true;
try {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this try..catch needed here? Is there a particular issue?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was not sure but in https://github.com/socketio/engine.io/blob/master/lib/server.js#L299
Same statement wrapped in try..catch so I did same.

var transport = new transports[req._query.transport](req);
if (req._query && req._query.b64) {
transport.supportsBinary = false;
} else {
transport.supportsBinary = true;
}
transport.perMessageDeflate = this.perMessageDeflate;
client.maybeUpgrade(transport);
} catch (e) {
debugError('error on upgrading exusting transport %O', e);
// Really need to close ?
socket.close();
}
transport.perMessageDeflate = this.perMessageDeflate;
client.maybeUpgrade(transport);
}
} else {
// transport error handling takes over
Expand All @@ -421,8 +433,8 @@ Server.prototype.onWebSocket = function (req, socket) {
this.handshake(req._query.transport, req);
}

function onUpgradeError () {
debug('websocket error before upgrade');
function onUpgradeError (e) {
debugError('websocket error before upgrade: %O', e);
// socket.close() not needed
}
};
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"superagent": "0.15.4"
},
"optionalDependencies": {
"uws": "0.13.0"
"uws": "^0.14.0"
},
"scripts": {
"test": "gulp test; EIO_WS_ENGINE=ws gulp test;"
Expand Down