Skip to content

Instantly share code, notes, and snippets.

@amabirbd
Created April 10, 2022 16:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amabirbd/b84ca52c9eb5d9d3b2b3d4cb5c0e39cb to your computer and use it in GitHub Desktop.
Save amabirbd/b84ca52c9eb5d9d3b2b3d4cb5c0e39cb to your computer and use it in GitHub Desktop.
Forwarding proxy with nodeJS proxy
const net = require("net");
const server = net.createServer();
// Listening to connection event
server.on("connection", (ClientToProxySocket) => {
console.log("Client connected to the proxy");
ClientToProxySocket.once("data", (data) => {
//checking if connection is HTTP or HTTPS
let isTLSConnection = data.toString().indexOf("CONNECT") !== -1;
//defining variable we will need later on
let serverPort = 80;
let serverAddress;
if (isTLSConnection) {
//change port to 443
serverPort = 443;
//Get address information from the request by splitting and filtering out
serverAddress = data
.toString()
.split("CONNECT")[1]
.split(" ")[1]
.split(":")[0];
} else {
// if it is not HTTPS, the port is already 80
// and we only need to filter out the address
serverAddress = data.toString().split("Host: ")[1].split("\n")[0];
}
//Creating a connection from proxy to destination server
let proxyToServerSocket = net.createConnection(
{
host: serverAddress,
port: serverPort,
},
() => {
console.log("Proxy to server set up");
}
);
if (isTLSConnection) {
ClientToProxySocket.write("HTTP/1.1 200 OK\r\n\n");
} else {
proxyToServerSocket.write(data);
}
ClientToProxySocket.pipe(proxyToServerSocket);
proxyToServerSocket.pipe(ClientToProxySocket);
proxyToServerSocket.on("error", (err) => {
console.log("Proxy to server error");
console.log(err);
});
ClientToProxySocket.on("error", (err) => {
console.log("Client to proxy error");
});
});
});
// Listening to error event
server.on("error", (err) => {
console.log("Some internal server error occured");
console.log(err);
});
// Listening to close event
server.on("close", (ClientToProxySocket) => {
console.log("Client disconnected");
});
server.listen(
{
host: "0.0.0.0",
port: 8080,
},
() => {
console.log("Server listening on 0.0.0.0:8080 ");
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment