Created
March 24, 2024 00:58
-
-
Save ps-jessejjohnson/0850672d67c9906a7fc6f6a000668511 to your computer and use it in GitHub Desktop.
Nodejs HTTP Tunnel
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
import { createServer, request } from 'node:http'; | |
import { connect } from 'node:net'; | |
import { URL } from 'node:url'; | |
// Create an HTTP tunneling proxy | |
const proxy = createServer((req, res) => { | |
res.writeHead(200, { 'Content-Type': 'text/plain' }); | |
res.end('okay'); | |
}); | |
proxy.on('connect', (req, clientSocket, head) => { | |
// Connect to an origin server | |
const { port, hostname } = new URL(`http://${req.url}`); | |
const serverSocket = connect(port || 80, hostname, () => { | |
clientSocket.write('HTTP/1.1 200 Connection Established\r\n' + | |
'Proxy-agent: Node.js-Proxy\r\n' + | |
'\r\n'); | |
serverSocket.write(head); | |
serverSocket.pipe(clientSocket); | |
clientSocket.pipe(serverSocket); | |
}); | |
}); | |
// Now that proxy is running | |
proxy.listen(1337, '127.0.0.1', () => { | |
// Make a request to a tunneling proxy | |
const options = { | |
port: 1337, | |
host: '127.0.0.1', | |
method: 'CONNECT', | |
path: 'www.google.com:80', | |
}; | |
const req = request(options); | |
req.end(); | |
req.on('connect', (res, socket, head) => { | |
console.log('got connected!'); | |
// Make a request over an HTTP tunnel | |
socket.write('GET / HTTP/1.1\r\n' + | |
'Host: www.google.com:80\r\n' + | |
'Connection: close\r\n' + | |
'\r\n'); | |
socket.on('data', (chunk) => { | |
console.log(chunk.toString()); | |
}); | |
socket.on('end', () => { | |
proxy.close(); | |
}); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment