From 9d1ccbad252c67f212a0f44ac92c9f4f00d818bf Mon Sep 17 00:00:00 2001 From: efkan Date: Mon, 27 Feb 2017 16:43:57 +0200 Subject: [PATCH 1/6] Adding async-await for generateId function When providing an Id from an in-memory database, accessing the database over the network and getting the id may cause to skip `id` assignment. In this case id will be `undefined`. Because of this reason engine.io fall into an endless loop. To overcome this issue async-await combination can be used. Also async-await solution is not a breaking change. --- lib/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/server.js b/lib/server.js index 99dfb4150..24876c289 100644 --- a/lib/server.js +++ b/lib/server.js @@ -290,8 +290,8 @@ Server.prototype.generateId = function (req) { * @api private */ -Server.prototype.handshake = function (transportName, req) { - var id = this.generateId(req); +Server.prototype.handshake = async function (transportName, req) { + var id = await this.generateId(req); debug('handshaking client "%s"', id); From ed173d536de5cc32f9da5537bd6037e1825041d7 Mon Sep 17 00:00:00 2001 From: efkan Date: Tue, 28 Feb 2017 14:17:10 +0200 Subject: [PATCH 2/6] Update server.js --- lib/server.js | 79 ++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/lib/server.js b/lib/server.js index 24876c289..f251bb257 100644 --- a/lib/server.js +++ b/lib/server.js @@ -290,53 +290,54 @@ Server.prototype.generateId = function (req) { * @api private */ -Server.prototype.handshake = async function (transportName, req) { - var id = await this.generateId(req); - - debug('handshaking client "%s"', id); +Server.prototype.handshake = function (transportName, req) { + this.generateId(req, function(id) { + + debug('handshaking client "%s"', id); + + try { + var transport = new transports[transportName](req); + if ('polling' === transportName) { + transport.maxHttpBufferSize = this.maxHttpBufferSize; + transport.httpCompression = this.httpCompression; + } else if ('websocket' === transportName) { + transport.perMessageDeflate = this.perMessageDeflate; + } - try { - var transport = new transports[transportName](req); - if ('polling' === transportName) { - transport.maxHttpBufferSize = this.maxHttpBufferSize; - transport.httpCompression = this.httpCompression; - } else if ('websocket' === transportName) { - transport.perMessageDeflate = this.perMessageDeflate; + if (req._query && req._query.b64) { + transport.supportsBinary = false; + } else { + transport.supportsBinary = true; + } + } catch (e) { + sendErrorMessage(req, req.res, Server.errors.BAD_REQUEST); + return; } - - if (req._query && req._query.b64) { - transport.supportsBinary = false; - } else { - transport.supportsBinary = true; + var socket = new Socket(id, this, transport, req); + var self = this; + + if (false !== this.cookie) { + transport.on('headers', function (headers) { + headers['Set-Cookie'] = cookieMod.serialize(self.cookie, id, + { + path: self.cookiePath, + httpOnly: self.cookiePath ? self.cookieHttpOnly : false + }); + }); } - } catch (e) { - sendErrorMessage(req, req.res, Server.errors.BAD_REQUEST); - return; - } - var socket = new Socket(id, this, transport, req); - var self = this; - if (false !== this.cookie) { - transport.on('headers', function (headers) { - headers['Set-Cookie'] = cookieMod.serialize(self.cookie, id, - { - path: self.cookiePath, - httpOnly: self.cookiePath ? self.cookieHttpOnly : false - }); - }); - } + transport.onRequest(req); - transport.onRequest(req); + this.clients[id] = socket; + this.clientsCount++; - this.clients[id] = socket; - this.clientsCount++; + socket.once('close', function () { + delete self.clients[id]; + self.clientsCount--; + }); - socket.once('close', function () { - delete self.clients[id]; - self.clientsCount--; + this.emit('connection', socket); }); - - this.emit('connection', socket); }; /** From 494bf53b969d3923b8bdd1b1f35a0e93219395ea Mon Sep 17 00:00:00 2001 From: efkan Date: Tue, 28 Feb 2017 14:28:02 +0200 Subject: [PATCH 3/6] Update server.js --- lib/server.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/server.js b/lib/server.js index f251bb257..e46f89be5 100644 --- a/lib/server.js +++ b/lib/server.js @@ -291,7 +291,8 @@ Server.prototype.generateId = function (req) { */ Server.prototype.handshake = function (transportName, req) { - this.generateId(req, function(id) { + + this.generateId(req, function (id) { debug('handshaking client "%s"', id); From c7df642205ee4fdd699d4e7249cf526d33ba9f40 Mon Sep 17 00:00:00 2001 From: efkan Date: Tue, 28 Feb 2017 14:38:13 +0200 Subject: [PATCH 4/6] Update server.js --- lib/server.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/server.js b/lib/server.js index e46f89be5..26a1d3883 100644 --- a/lib/server.js +++ b/lib/server.js @@ -291,9 +291,7 @@ Server.prototype.generateId = function (req) { */ Server.prototype.handshake = function (transportName, req) { - this.generateId(req, function (id) { - debug('handshaking client "%s"', id); try { From 12aa6276e0043c6ecf386d39c98ec9fa0543f10f Mon Sep 17 00:00:00 2001 From: efkan Date: Tue, 28 Feb 2017 14:43:12 +0200 Subject: [PATCH 5/6] Update server.js --- lib/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/server.js b/lib/server.js index 26a1d3883..8cf29b4c0 100644 --- a/lib/server.js +++ b/lib/server.js @@ -278,8 +278,8 @@ function sendErrorMessage (req, res, code) { * @api public */ -Server.prototype.generateId = function (req) { - return base64id.generateId(); +Server.prototype.generateId = function (req, done) { + done(base64id.generateId()); }; /** From 48f675f3a49319762bf6228cea1d1feae053c615 Mon Sep 17 00:00:00 2001 From: efkan Date: Tue, 28 Feb 2017 15:09:54 +0200 Subject: [PATCH 6/6] Update server.js --- lib/server.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/server.js b/lib/server.js index 8cf29b4c0..aeda6a144 100644 --- a/lib/server.js +++ b/lib/server.js @@ -291,16 +291,18 @@ Server.prototype.generateId = function (req, done) { */ Server.prototype.handshake = function (transportName, req) { + var self = this; + var this_ = this; this.generateId(req, function (id) { debug('handshaking client "%s"', id); try { var transport = new transports[transportName](req); if ('polling' === transportName) { - transport.maxHttpBufferSize = this.maxHttpBufferSize; - transport.httpCompression = this.httpCompression; + transport.maxHttpBufferSize = this_.maxHttpBufferSize; + transport.httpCompression = this_.httpCompression; } else if ('websocket' === transportName) { - transport.perMessageDeflate = this.perMessageDeflate; + transport.perMessageDeflate = this_.perMessageDeflate; } if (req._query && req._query.b64) { @@ -312,8 +314,7 @@ Server.prototype.handshake = function (transportName, req) { sendErrorMessage(req, req.res, Server.errors.BAD_REQUEST); return; } - var socket = new Socket(id, this, transport, req); - var self = this; + var socket = new Socket(id, this_, transport, req); if (false !== this.cookie) { transport.on('headers', function (headers) {