You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.2 KiB
110 lines
3.2 KiB
// Stolen from Devendra Tewari |
|
// (http://delog.wordpress.com/2011/04/08/a-simple-tcp-proxy-in-node-js/) |
|
|
|
var net = require('net'); |
|
|
|
process.on("uncaughtException", function(e) { |
|
console.log(e); |
|
}); |
|
|
|
module.exports.route = function (proxyPort, servicePort, serviceHost) { |
|
var proxyRoute = this; |
|
proxyRoute.proxyPort = proxyPort || 9001; |
|
var servicePort = servicePort || 5672; |
|
var serviceHost = serviceHost || '127.0.0.1'; |
|
|
|
proxyRoute.operational = true; |
|
proxyRoute.serviceSockets = []; |
|
proxyRoute.proxySockets = []; |
|
|
|
proxyRoute.server = net.createServer(function (proxySocket) { |
|
// If we're "experiencing trouble", immediately end the connection. |
|
if (!proxyRoute.operational) { |
|
proxySocket.end(); |
|
return; |
|
} |
|
|
|
// If we're operating normally, accept the connection and begin proxying traffic. |
|
proxyRoute.proxySockets.push(proxySocket); |
|
|
|
var connected = false; |
|
var buffers = []; |
|
var serviceSocket = new net.Socket(); |
|
proxyRoute.serviceSockets.push(serviceSocket); |
|
serviceSocket.connect(parseInt(servicePort), serviceHost); |
|
serviceSocket.on('connect', function() { |
|
connected = true; |
|
for (var i in buffers) { |
|
serviceSocket.write(buffers[i]); |
|
} |
|
buffers = []; |
|
}); |
|
proxySocket.on('error', function (e) { |
|
serviceSocket.end(); |
|
}); |
|
serviceSocket.on('error', function (e) { |
|
console.log('Could not connect to service at host ' + serviceHost + ', port ' + servicePort); |
|
proxySocket.end(); |
|
}); |
|
proxySocket.on("data", function (data) { |
|
if (proxyRoute.operational) { |
|
if (connected) { |
|
serviceSocket.write(data); |
|
} else { |
|
buffers.push(data); |
|
} |
|
} |
|
}); |
|
serviceSocket.on("data", function(data) { |
|
if (proxyRoute.operational) { |
|
proxySocket.write(data); |
|
} |
|
}); |
|
proxySocket.on("close", function(had_error) { |
|
serviceSocket.end(); |
|
}); |
|
serviceSocket.on("close", function(had_error) { |
|
proxySocket.end(); |
|
}); |
|
}); |
|
proxyRoute.listen(); |
|
}; |
|
module.exports.route.prototype.listen = function () { |
|
var proxyRoute = this; |
|
proxyRoute.operational = true; |
|
proxyRoute.server.listen(proxyRoute.proxyPort); |
|
}; |
|
module.exports.route.prototype.close = function () { |
|
var proxyRoute = this; |
|
proxyRoute.operational = false; |
|
for (var index in proxyRoute.serviceSockets) { |
|
proxyRoute.serviceSockets[index].destroy(); |
|
} |
|
proxyRoute.serviceSockets = []; |
|
for (var index in proxyRoute.proxySockets) { |
|
proxyRoute.proxySockets[index].destroy(); |
|
} |
|
proxyRoute.proxySockets = []; |
|
proxyRoute.server.close(); |
|
}; |
|
module.exports.route.prototype.interrupt = function (howLong) { |
|
var proxyRoute = this; |
|
console.log('interrupting proxy connection...'); |
|
proxyRoute.close(); |
|
setTimeout(function () { |
|
proxyRoute.listen(); |
|
}, howLong || 50); |
|
}; |
|
|
|
if (!module.parent) { |
|
var proxyPort = process.argv[2]; |
|
var servicePort = process.argv[3]; |
|
var serviceHost = process.argv[4]; |
|
var proxyRoute = new module.exports.route(proxyPort, servicePort, serviceHost); |
|
// Don't exit until parent kills us. |
|
setInterval(function () { |
|
if (process.argv[5]) { |
|
proxyRoute.interrupt(); |
|
} |
|
}, parseInt(process.argv[5]) || 1000); |
|
} |