A *Useful* HTTP Proxy Server in 66 Lines of node.js Code
Here : Proxy.js
See also : DummyServer.js
It runs from the command line and has no dependencies other than node.js (I was tempted to add handling via command.js but that can wait).
Node is a Javascript engine based on V8, the one behind Google Chrome. It’s available for most OSes and is an easy install. It’s in the Ubuntu repository but to be more up-to-date check this ppa.
I got stuck earlier with a bit of work-work where clicking on a browser submit button wasn’t doing what it should have, with Chrome dev tools I couldn’t be sure if it was redirecting or what. Cue a proxy. I used to use the Java one that was bundled in with Axis2, but as it happens I made one in node.js recently (needed internally for Seki). A few tweaks later and here it is.
The code was originally based on A HTTP Proxy Server in 20 Lines of node.js Code but that uses methods now deprecated.
So, running :
node Proxy.js
and then in a different shell,
$ curl http://localhost:8888/anything
it produces:
Proxy addressing localhost:8080 Serving on localhost:8888 ***** Calling localhost:8080/anything ***** Request : { "host": "localhost", "port": 8080, "path": "/anything", "method": "GET", "headers": { "user-agent": "curl/7.32.0", "host": "localhost:8888", "accept": "*/*" } } ----- Response : HTTP 200 { "content-type": "text/plain", "date": "Wed, 30 Oct 2013 11:43:49 GMT", "connection": "keep-alive", "transfer-encoding": "chunked" } Body : Hello World! *****
For this example I had:
node DummyServer.js
running in another shell, that produced:
Server running at localhost:8080 { "user-agent": "curl/7.32.0", "host": "localhost:8888", "accept": "*/*", "connection": "keep-alive" } URL = /anything
I’m guessing it’d be fairly straightforward to do the same kind of thing at a lower level using sockets. For more features there’s the npm package node-http-proxy.
Let me know if you think of any little tweaks/additions that might make it more useful.