Created
October 29, 2011 11:43
-
-
Save oscarrenalias/1324360 to your computer and use it in GitHub Desktop.
A very simple Node HTTP proxy that proxies requests to the server given in the GET or POST URL. Heavily inspired by http://www.catonmat.net/http-proxy-in-nodejs/.
This file contains 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
// | |
// How to use: | |
// | |
// 1. Start node: | |
// node nodeproxy.js | |
// 2. Send a URL like this: | |
// http://localhost:8080/http://www.google.com | |
// | |
// Watch www.google.com come through your local HTTP proxy. | |
// | |
// What is this useful for? | |
// Cross-domain Ajax requests can be rewritten so that they are routed through the local proxy, this can be easily | |
// done in your JS code by wrapping them in a function that checks if we're developing locally and if so include | |
// http://localhost:8080 in front of the URL. You can also extend the prototype of the String class: | |
// | |
// String.prototype. = function() { | |
// if(runningLocally) { | |
// return("http://localhost:8080" + this); | |
// } | |
// else { | |
// return(this); | |
// } | |
// } | |
// | |
// ... | |
// $.ajax("http://yoursevice/ajax/request".prx, ...) | |
// | |
var http = require('http'), | |
url = require('url'); | |
http.createServer(function(request, response) { | |
target = request.url; | |
if(target[0] == "/") // remove the leading forward slash | |
target = target.substring(1, target.length); | |
console.log("Request received. Target: " + target); | |
// parse the url | |
url_parts = url.parse(target); | |
if(url_parts.host == undefined) { // stop processing, URL must contain http(s):// | |
response.write("ERROR: missing host in target URL " + target); | |
response.end(); | |
} | |
else { | |
var proxy = http.createClient(80, url_parts.host) | |
var proxy_request = proxy.request(request.method, url_parts.href, request.headers); | |
console.log("Creating proxy request to server: " + url_parts.hostname + ", path: " + url_parts.pathname); | |
proxy_request.addListener('response', function (proxy_response) { | |
proxy_response.addListener('data', function(chunk) { | |
response.write(chunk, 'binary'); | |
}); | |
proxy_response.addListener('end', function() { | |
response.end(); | |
}); | |
response.writeHead(proxy_response.statusCode, proxy_response.headers); | |
}); | |
request.addListener('data', function(chunk) { | |
proxy_request.write(chunk, 'binary'); | |
}); | |
request.addListener('end', function() { | |
proxy_request.end(); | |
}); | |
} | |
}).listen(8080); | |
console.log("Proxy started. Listening to port 8080"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment