Skip to content

Instantly share code, notes, and snippets.

@grantmichaels
Forked from brandon-lockaby/proxy.js
Created May 13, 2012 17:27
Show Gist options
  • Save grantmichaels/2689383 to your computer and use it in GitHub Desktop.
Save grantmichaels/2689383 to your computer and use it in GitHub Desktop.
node.js tcp proxy
var net = require("net");
var Proxy = function() {
};
Proxy.to = function(dst_host, dst_port) {
var proxy = new Proxy();
proxy.dstHost = dst_host;
proxy.dstPort = dst_port;
proxy.mid = [];
return proxy;
};
Proxy.prototype.use = function(fn) {
this.mid.push(fn);
return this;
}
Proxy.prototype.handle = function(data, src, dst) {
var next = Proxy.nop;
for(var i = this.mid.length - 1; i >= 0; i--) {
next = this.mid[i].bind(this, data, src, dst, next);
}
next();
return this;
};
Proxy.prototype.listen = function(port) {
var self = this;
this.server = net.createServer(function (sockA) {
var preb = [];
sockA.on("data", pre = function(data) {
preb.push(data);
});
var sockB = net.connect(self.dstPort, self.dstHost, function() {
sockA.removeListener("data", pre);
while(preb.length) {
self.handle(preb.shift(), sockA, sockB);
}
sockA.on("data", function(data) {
self.handle(data, sockA, sockB);
});
sockB.on("data", function(data) {
self.handle(data, sockB, sockA);
});
sockA.on("end", function() {
sockB.removeAllListeners();
sockB.end();
});
sockB.on("end", function() {
sockA.removeAllListeners();
sockA.end();
});
});
});
this.server.listen(port, function() {
// hello I am listening
});
return this;
};
// built-in middlewares
Proxy.nop = function() {
};
Proxy.send = function(data, src, dst, next) {
dst.write(data);
next();
};
Proxy.consoleLog = function(data, src, dst, next) {
console.log(" … " + src.remoteAddress + ":" + src.remotePort + " --> " + dst.remoteAddress + ":" + dst.remotePort);
console.log(data.toString());
next();
};
////////////////////////////////
Proxy.to("www.bestbeer.com", 80).use(Proxy.consoleLog).use(Proxy.send).listen(8080);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment