web: get remoteAddress for socket with cloudflare header

This commit is contained in:
Braydon Fuller 2016-05-18 00:17:45 -04:00
parent 57cb146ce0
commit bf080422ed
2 changed files with 38 additions and 5 deletions

View File

@ -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();
});
};

View File

@ -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);