Created
April 10, 2022 16:45
-
-
Save amabirbd/b84ca52c9eb5d9d3b2b3d4cb5c0e39cb to your computer and use it in GitHub Desktop.
Forwarding proxy with nodeJS proxy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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