From bf080422ed4b4b2514aa47b1efa32534b6bdee21 Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Wed, 18 May 2016 00:17:45 -0400 Subject: [PATCH] web: get remoteAddress for socket with cloudflare header --- lib/services/web.js | 11 ++++++----- test/services/web.unit.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/lib/services/web.js b/lib/services/web.js index 0008b745..b050b5d5 100644 --- a/lib/services/web.js +++ b/lib/services/web.js @@ -159,7 +159,7 @@ WebService.prototype.getEventNames = function() { }; WebService.prototype._getRemoteAddress = function(socket) { - return socket.conn.remoteAddress; + return socket.client.request.headers['cf-connecting-ip'] || socket.conn.remoteAddress; }; /** @@ -169,19 +169,20 @@ WebService.prototype._getRemoteAddress = function(socket) { */ WebService.prototype.socketHandler = function(socket) { var self = this; - var bus = this.node.openBus({remoteAddress: self._getRemoteAddress(socket)}); + var remoteAddress = self._getRemoteAddress(socket); + var bus = this.node.openBus({remoteAddress: remoteAddress}); if (this.enableSocketRPC) { socket.on('message', this.socketMessageHandler.bind(this)); } socket.on('subscribe', function(name, params) { - log.info(self._getRemoteAddress(socket), 'web socket subscribe:', name); + log.info(remoteAddress, 'web socket subscribe:', name); bus.subscribe(name, params); }); socket.on('unsubscribe', function(name, params) { - log.info(self._getRemoteAddress(socket), 'web socket unsubscribe:', name); + log.info(remoteAddress, 'web socket unsubscribe:', name); bus.unsubscribe(name, params); }); @@ -201,7 +202,7 @@ WebService.prototype.socketHandler = function(socket) { }); socket.on('disconnect', function() { - log.info(self._getRemoteAddress(socket), 'web socket disconnect'); + log.info(remoteAddress, 'web socket disconnect'); bus.close(); }); }; diff --git a/test/services/web.unit.js b/test/services/web.unit.js index c0f720d6..57490932 100644 --- a/test/services/web.unit.js +++ b/test/services/web.unit.js @@ -210,6 +210,32 @@ describe('WebService', function() { }); }); + describe('#_getRemoteAddress', function() { + it('will get remote address from cloudflare header', function() { + var web = new WebService({node: defaultNode}); + var socket = {}; + socket.conn = {}; + socket.client = {}; + socket.client.request = {}; + socket.client.request.headers = { + 'cf-connecting-ip': '127.0.0.1' + }; + var remoteAddress = web._getRemoteAddress(socket); + remoteAddress.should.equal('127.0.0.1'); + }); + it('will get remote address from connection', function() { + var web = new WebService({node: defaultNode}); + var socket = {}; + socket.conn = {}; + socket.conn.remoteAddress = '127.0.0.1'; + socket.client = {}; + socket.client.request = {}; + socket.client.request.headers = {}; + var remoteAddress = web._getRemoteAddress(socket); + remoteAddress.should.equal('127.0.0.1'); + }); + }); + describe('#socketHandler', function() { var bus = new EventEmitter(); bus.remoteAddress = '127.0.0.1'; @@ -244,6 +270,9 @@ describe('WebService', function() { socket = new EventEmitter(); socket.conn = {}; socket.conn.remoteAddress = '127.0.0.1'; + socket.client = {}; + socket.client.request = {}; + socket.client.request.headers = {}; web.socketHandler(socket); socket.emit('message', 'data'); }); @@ -255,6 +284,9 @@ describe('WebService', function() { socket = new EventEmitter(); socket.conn = {}; socket.conn.remoteAddress = '127.0.0.1'; + socket.client = {}; + socket.client.request = {}; + socket.client.request.headers = {}; web.socketHandler(socket); socket.on('message', function() { web.socketMessageHandler.callCount.should.equal(0);