From f1611ec8dcb217f4f50d4cbebdc61e6823c9d6ce Mon Sep 17 00:00:00 2001 From: Christian Howe Date: Wed, 28 Mar 2012 16:33:00 -0500 Subject: [PATCH 1/2] Fix problem with req.url not being not properly replaced. --- lib/node-http-proxy/proxy-table.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/node-http-proxy/proxy-table.js b/lib/node-http-proxy/proxy-table.js index 9035ab8da..d5ec7fdc7 100644 --- a/lib/node-http-proxy/proxy-table.js +++ b/lib/node-http-proxy/proxy-table.js @@ -26,7 +26,8 @@ var util = require('util'), events = require('events'), - fs = require('fs'); + fs = require('fs'), + url = require('url'); // // ### function ProxyTable (router, silent) @@ -137,17 +138,17 @@ ProxyTable.prototype.getProxyLocation = function (req) { for (var i in this.routes) { var route = this.routes[i]; if (target.match(route.route)) { - var pathSegments = route.path.split('/'); - - if (pathSegments.length > 1) { - // don't include the proxytable path segments in the proxied request url - pathSegments = new RegExp("/" + pathSegments.slice(1).join('/')); - req.url = req.url.replace(pathSegments, ''); - } - - var location = route.target.split(':'), - host = location[0], - port = location.length === 1 ? 80 : location[1]; + var requrl = url.parse(req.url); + //add the 'http://'' to get around a url.parse bug, it won't actually be used. + var targeturl = url.parse('http://'+route.target); + var pathurl = url.parse('http://'+route.path); + + //This replaces the path's part of the URL to the target's part of the URL. + requrl.pathname = requrl.pathname.replace(pathurl.pathname, targeturl.pathname); + req.url = url.format(requrl); + + var host = targeturl.hostname, + port = targeturl.port || 80; return { port: port, From 5d839dd5f8890c6d2af96807b96d1bd5bb0f7276 Mon Sep 17 00:00:00 2001 From: Christian Howe Date: Wed, 11 Apr 2012 16:13:25 -0400 Subject: [PATCH 2/2] Add tests for remapping URL properly. --- test/http/routing-proxy-test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/http/routing-proxy-test.js b/test/http/routing-proxy-test.js index b97094bd4..54a25d0da 100644 --- a/test/http/routing-proxy-test.js +++ b/test/http/routing-proxy-test.js @@ -32,6 +32,9 @@ var defaultOptions = { "bar.com": "127.0.0.1:8092", "baz.com/taco": "127.0.0.1:8098", "pizza.com/taco/muffins": "127.0.0.1:8099", + "blah.com/me": "127.0.0.1:8088/remapped", + "bleh.com/remap/this": "127.0.0.1:8087/remap/remapped", + "test.com/double/tap": "127.0.0.1:8086/remap", } }; @@ -53,7 +56,10 @@ vows.describe('node-http-proxy/routing-proxy/' + testName).addBatch({ "an incoming request to foo.com": runner.assertProxied('foo.com', 8090, 8091), "an incoming request to bar.com": runner.assertProxied('bar.com', 8090, 8092), "an incoming request to baz.com/taco": runner.assertProxied('baz.com', 8090, 8098, "/taco", "/"), - "an incoming request to pizza.com/taco/muffins": runner.assertProxied('pizza.com', 8090, 8099, "/taco/muffins", "/taco"), + "an incoming request to pizza.com/taco/muffins": runner.assertProxied('pizza.com', 8090, 8099, "/taco/muffins", "/"), + "an incoming request to blah.com/me/fun": runner.assertProxied('blah.com', 8090, 8088, "/me/fun", "/remapped/fun"), + "an incoming request to bleh.com/remap/this": runner.assertProxied('bleh.com', 8090, 8087, "/remap/this", "/remap/remapped"), + "an incoming request to test.com/double/tap/double/tap": runner.assertProxied('test.com', 8090, 8086, "/double/tap/double/tap", "/remap/double/tap"), "an incoming request to unknown.com": runner.assertResponseCode(8090, 404) }, "and routing by Hostname": {