-
-
Save tonygambone/2422322 to your computer and use it in GitHub Desktop.
// HTTP forward proxy server that can also proxy HTTPS requests | |
// using the CONNECT method | |
// requires https://github.com/nodejitsu/node-http-proxy | |
var httpProxy = require('http-proxy'), | |
url = require('url'), | |
net = require('net'), | |
http = require('http'); | |
process.on('uncaughtException', logError); | |
function truncate(str) { | |
var maxLength = 64; | |
return (str.length >= maxLength ? str.substring(0,maxLength) + '...' : str); | |
} | |
function logRequest(req) { | |
console.log(req.method + ' ' + truncate(req.url)); | |
for (var i in req.headers) | |
console.log(' * ' + i + ': ' + truncate(req.headers[i])); | |
} | |
function logError(e) { | |
console.warn('*** ' + e); | |
} | |
// this proxy will handle regular HTTP requests | |
var regularProxy = new httpProxy.RoutingProxy(); | |
// standard HTTP server that will pass requests | |
// to the proxy | |
var server = http.createServer(function (req, res) { | |
logRequest(req); | |
uri = url.parse(req.url); | |
regularProxy.proxyRequest(req, res, { | |
host: uri.hostname, | |
port: uri.port || 80 | |
}); | |
}); | |
// when a CONNECT request comes in, the 'upgrade' | |
// event is emitted | |
server.on('upgrade', function(req, socket, head) { | |
logRequest(req); | |
// URL is in the form 'hostname:port' | |
var parts = req.url.split(':', 2); | |
// open a TCP connection to the remote host | |
var conn = net.connect(parts[1], parts[0], function() { | |
// respond to the client that the connection was made | |
socket.write("HTTP/1.1 200 OK\r\n\r\n"); | |
// create a tunnel between the two hosts | |
socket.pipe(conn); | |
conn.pipe(socket); | |
}); | |
}); | |
server.listen(3333); |
this not works with common tcp proxy, how to make it possible.
CONNECT proxy.exmpale.com:80 HTTP/1.1
not works !
Thank you so much. Like an earlier comment I changed 'upgrade' to 'connect'. Also, since http-proxy has changed since, I had to modify the definition of regularProxy and changed the call of regularProxy.proxyRequest(...) to regularProxy.web(req, res, { target: 'http://' + req.headers.host }). Otherwise pretty much verbatim!
httpProxy.RoutingProxy
does not exist anymore. See this StackOverflow answer (notice the edit); new httpProxy.RoutingProxy()
has to be changed to httpProxy.createProxyServer({})
. Following the previous comment, I changed regularProxy.proxyRequest(req, res, { ... })
to
regularProxy.web(req, res, {target: "http://" + req.headers.host});
and it seems to work well (also for https somehow.)
Nice work! With the help of above comments, I made it work.
I'm wondering if it is possible to log https request & response content by node-http-proxy
. It looks connect
event handler cannot have access to https content.
The parameter function of http.createServer
is never called. It still works with var server = http.createServer();
. As a result, no way to intercept https request/response.
working project https://github.com/imhazige/node-http-connect-proxy
What's the license on this?
working project https://github.com/imhazige/node-http-connect-proxy
this works for me! Thanks
server.on('upgrade' doesnt work.. changing upgrade to well "connect" does seem to work.. Dont know why - trying to figure out this crap myself.. ;)