From 22737aa1f7126b4d4fed285b0b1c62e0999a7698 Mon Sep 17 00:00:00 2001 From: Christian Werz Date: Wed, 12 Feb 2020 00:06:50 +0100 Subject: [PATCH 1/5] allow all methods add redirect with 307 --- src/daemon/group.js | 2 +- src/daemon/routers/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/daemon/group.js b/src/daemon/group.js index d2d60d9d..d89e56b3 100644 --- a/src/daemon/group.js +++ b/src/daemon/group.js @@ -326,7 +326,7 @@ class Group extends EventEmitter { // Make sure to send only one response const send = once(() => { log(`Redirect - ${id} → ${item.target}`) - res.redirect(item.target) + res.redirect(307, item.target) }) if (item.start) { diff --git a/src/daemon/routers/index.js b/src/daemon/routers/index.js index 90753c76..5f102f24 100644 --- a/src/daemon/routers/index.js +++ b/src/daemon/routers/index.js @@ -16,7 +16,7 @@ module.exports = function(group) { router .get('/proxy.pac', pac) - .get( + .all( '/:id', group.exists.bind(group), group.start.bind(group), From 16c28c13b5d4ad054347479604ef3be1e46e441f Mon Sep 17 00:00:00 2001 From: Christian Werz Date: Wed, 12 Feb 2020 00:14:36 +0100 Subject: [PATCH 2/5] add wildcard for path add path to target --- src/daemon/group.js | 11 ++++++++--- src/daemon/routers/index.js | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/daemon/group.js b/src/daemon/group.js index d89e56b3..6bf40a5f 100644 --- a/src/daemon/group.js +++ b/src/daemon/group.js @@ -322,12 +322,17 @@ class Group extends EventEmitter { redirect(req, res) { const { id } = req.params const { item } = req.hotel + let target = item.target; + let path = req.params[0] || '' + + + target = (target.endsWith('/') ? '' : '/') + path; // Make sure to send only one response const send = once(() => { - log(`Redirect - ${id} → ${item.target}`) - res.redirect(307, item.target) - }) + log(`Redirect - ${id} → ${target}`); + res.redirect(307, target); + }); if (item.start) { // Set target diff --git a/src/daemon/routers/index.js b/src/daemon/routers/index.js index 5f102f24..615d221f 100644 --- a/src/daemon/routers/index.js +++ b/src/daemon/routers/index.js @@ -17,7 +17,7 @@ module.exports = function(group) { router .get('/proxy.pac', pac) .all( - '/:id', + '/:id/*', group.exists.bind(group), group.start.bind(group), group.redirect.bind(group) From b9266e36c1e501cdfd3431fa2d5a81dc774eae61 Mon Sep 17 00:00:00 2001 From: David Braley Date: Thu, 20 Feb 2020 11:01:06 -0500 Subject: [PATCH 3/5] Some fixes to make the tests pass and code act as expected --- src/daemon/group.js | 11 ++++------- src/daemon/routers/index.js | 2 +- test/daemon/app.js | 6 +++--- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/daemon/group.js b/src/daemon/group.js index 6bf40a5f..f6614ccc 100644 --- a/src/daemon/group.js +++ b/src/daemon/group.js @@ -322,17 +322,14 @@ class Group extends EventEmitter { redirect(req, res) { const { id } = req.params const { item } = req.hotel - let target = item.target; let path = req.params[0] || '' - - target = (target.endsWith('/') ? '' : '/') + path; - // Make sure to send only one response const send = once(() => { - log(`Redirect - ${id} → ${target}`); - res.redirect(307, target); - }); + let target = item.target + (item.target.endsWith('/') ? '' : '/') + path + log(`Redirect - ${id} → ${target}`) + res.redirect(307, target) + }) if (item.start) { // Set target diff --git a/src/daemon/routers/index.js b/src/daemon/routers/index.js index 615d221f..cf6cbf6d 100644 --- a/src/daemon/routers/index.js +++ b/src/daemon/routers/index.js @@ -17,7 +17,7 @@ module.exports = function(group) { router .get('/proxy.pac', pac) .all( - '/:id/*', + ['/:id', '/:id/*'], group.exists.bind(group), group.start.bind(group), group.redirect.bind(group) diff --git a/test/daemon/app.js b/test/daemon/app.js index 3ff8d1b5..cceceac2 100644 --- a/test/daemon/app.js +++ b/test/daemon/app.js @@ -245,7 +245,7 @@ test.cb('GET http://localhost:2000/node should redirect to node server', t => { .get('/node') .set('Host', 'localhost') .expect('location', /http:\/\/localhost:51234/) - .expect(302, t.end) + .expect(307, t.end) }) test.cb( @@ -257,7 +257,7 @@ test.cb( request(app) .get('/node') .expect('location', /http:\/\/127.0.0.1:51234/) - .expect(302, t.end) + .expect(307, t.end) } ) @@ -267,7 +267,7 @@ test.cb('GET http://localhost:2000/proxy should redirect to target', t => { .get('/proxy') .set('Host', 'localhost') .expect('location', /http:\/\/localhost:4000/) - .expect(302, t.end) + .expect(307, t.end) }) // From 04fc52fc8287394f7a970633657161b0eb0f303c Mon Sep 17 00:00:00 2001 From: David Braley Date: Thu, 20 Feb 2020 11:21:09 -0500 Subject: [PATCH 4/5] Add ability to forward to dev services by proxy rather than redirect --- src/cli/index.js | 5 +++++ src/cli/servers.js | 4 ++++ src/conf.js | 1 + src/daemon/group.js | 18 ++++++++++++++++-- test/cli/servers.js | 2 ++ test/daemon/app.js | 2 ++ 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/cli/index.js b/src/cli/index.js index 2538aa74..72a1ab58 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -40,6 +40,11 @@ const addOptions = { default: false, boolean: true }, + 'forward-by-proxy': { + describe: 'Proxies requests to this server rather than forwarding', + default: false, + boolean: true + }, dir: { describe: 'Server directory', string: true diff --git a/src/cli/servers.js b/src/cli/servers.js index 48320457..9828eb18 100644 --- a/src/cli/servers.js +++ b/src/cli/servers.js @@ -59,6 +59,10 @@ function add(param, opts = {}) { conf.httpProxyEnv = opts.httpProxyEnv } + if (opts.forwardByProxy) { + conf.mechanism = 'proxy' + } + if (isUrl(param)) { conf = { target: param, diff --git a/src/conf.js b/src/conf.js index 717d150d..b9912b0f 100644 --- a/src/conf.js +++ b/src/conf.js @@ -11,6 +11,7 @@ const defaults = { host: '127.0.0.1', timeout: 5000, tld: 'localhost', + mechanism: 'redirect', // Replace with your network proxy IP (1.2.3.4:5000) if any // For example, if you're behind a corporate proxy proxy: false diff --git a/src/daemon/group.js b/src/daemon/group.js index f6614ccc..c853908e 100644 --- a/src/daemon/group.js +++ b/src/daemon/group.js @@ -87,6 +87,14 @@ class Group extends EventEmitter { } } + if (conf.mechanism) { + log(`adding env.mechanism:${conf.mechanism}`) + conf.env = { + mechanism: conf.mechanism, + ...conf.env + } + } + let logFile if (conf.out) { logFile = path.resolve(conf.cwd, conf.out) @@ -327,8 +335,14 @@ class Group extends EventEmitter { // Make sure to send only one response const send = once(() => { let target = item.target + (item.target.endsWith('/') ? '' : '/') + path - log(`Redirect - ${id} → ${target}`) - res.redirect(307, target) + if (item.env && item.env.mechanism === 'proxy') { + let target = item.target + (item.target.endsWith('/') ? '' : '/') + path + log(`Proxy - ${id} → ${target}`) + this.proxyWeb(req, res, target) + } else { + log(`Redirect - ${id} → ${target}`) + res.redirect(307, target) + } }) if (item.start) { diff --git a/test/cli/servers.js b/test/cli/servers.js index 49cb17fe..05366e62 100644 --- a/test/cli/servers.js +++ b/test/cli/servers.js @@ -66,6 +66,7 @@ test('add should support options', t => { env[1], '-x', '--co', + '--forward-by-proxy', '--http-proxy-env' ]) @@ -82,6 +83,7 @@ test('add should support options', t => { }, xfwd: true, changeOrigin: true, + mechanism: 'proxy', httpProxyEnv: true } diff --git a/test/daemon/app.js b/test/daemon/app.js index cceceac2..ea7acf21 100644 --- a/test/daemon/app.js +++ b/test/daemon/app.js @@ -270,6 +270,8 @@ test.cb('GET http://localhost:2000/proxy should redirect to target', t => { .expect(307, t.end) }) +// TODO: Add tests for forward-by-proxy cases + // // Test daemon/app.js // From 58778f9db8a55e1c74932377adbf4973c940cdb7 Mon Sep 17 00:00:00 2001 From: David Braley Date: Mon, 13 Apr 2020 17:19:42 -0400 Subject: [PATCH 5/5] Add query paramters to the url in the case of forwarding, and fix the url correctly in the case of proxying --- src/daemon/group.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/daemon/group.js b/src/daemon/group.js index c853908e..45669587 100644 --- a/src/daemon/group.js +++ b/src/daemon/group.js @@ -335,10 +335,16 @@ class Group extends EventEmitter { // Make sure to send only one response const send = once(() => { let target = item.target + (item.target.endsWith('/') ? '' : '/') + path + let parsedUrl = url.parse(req.url) + if (parsedUrl.search) { + target = target + parsedUrl.search + } + if (item.env && item.env.mechanism === 'proxy') { - let target = item.target + (item.target.endsWith('/') ? '' : '/') + path + // Adjusting the request is the easiest way to proxy the correct url + req.url = target log(`Proxy - ${id} → ${target}`) - this.proxyWeb(req, res, target) + this.proxyWeb(req, res, item.target) } else { log(`Redirect - ${id} → ${target}`) res.redirect(307, target)