From ddd649f2042eb0f857188d4f517383d884fe1b94 Mon Sep 17 00:00:00 2001 From: Konstantin Zolotarev Date: Wed, 29 Mar 2017 11:27:28 +0300 Subject: [PATCH 1/2] Upgrade uws to 0.14.x --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a0db31ef..85a9baa39 100644 --- a/package.json +++ b/package.json @@ -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;" From 7c7fa570b297ab9af561a9c5e4c9aea2c0d871cf Mon Sep 17 00:00:00 2001 From: Konstantin Zolotarev Date: Wed, 29 Mar 2017 11:56:45 +0300 Subject: [PATCH 2/2] server.js enchanted debug --- lib/server.js | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/server.js b/lib/server.js index 91d2b116e..16fe8e750 100644 --- a/lib/server.js +++ b/lib/server.js @@ -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'); /** @@ -150,7 +151,7 @@ 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); } @@ -158,15 +159,19 @@ Server.prototype.verify = function (req, upgrade, fn) { 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); } @@ -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; } @@ -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; } @@ -391,13 +397,13 @@ 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'); @@ -405,14 +411,20 @@ Server.prototype.onWebSocket = function (req, socket) { // 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 { + 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 @@ -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 } };