diff --git a/README.md b/README.md index 711f9da3..0c8a1eab 100644 --- a/README.md +++ b/README.md @@ -266,7 +266,7 @@ Allows you to inspect the proxy response, and decide if you want to continue pro ```js app.use('/proxy', proxy('www.google.com', { - skipToNextHandlerFilter: function(proxyRes) { + skipToNextHandlerFilter: function(proxyRes, userReq, userRes) { return proxyRes.statusCode === 404; } })); diff --git a/app/steps/maybeSkipToNextHandler.js b/app/steps/maybeSkipToNextHandler.js index 9d70de14..a29912f9 100644 --- a/app/steps/maybeSkipToNextHandler.js +++ b/app/steps/maybeSkipToNextHandler.js @@ -1,14 +1,17 @@ 'use strict'; -function defaultSkipFilter(/* res */) { +function defaultSkipFilter(/* proxyRes, userReq, userRes */) { return false; } function maybeSkipToNextHandler(container) { var resolverFn = container.options.skipToNextHandlerFilter || defaultSkipFilter; + var proxyRes = container.proxy.res; + var userReq = container.user.req; + var userRes = container.user.res; return Promise - .resolve(resolverFn(container.proxy.res)) + .resolve(resolverFn(proxyRes, userReq, userRes)) .then(function (shouldSkipToNext) { if (shouldSkipToNext) { container.user.res.expressHttpProxy = container.proxy; diff --git a/test/maybeSkipToNextHandler.js b/test/maybeSkipToNextHandler.js index 4d2efedc..6a600131 100644 --- a/test/maybeSkipToNextHandler.js +++ b/test/maybeSkipToNextHandler.js @@ -27,16 +27,29 @@ describe('when skipToNextHandlerFilter is defined', function () { var OUTCOMES = [ { shouldSkip: true, expectedStatus: 200 }, - { shouldSkip: false, expectedStatus: 404 } + { shouldSkip: false, expectedStatus: 404 }, + { shouldSkip: true, expectedStatus: 200, delayedSkipProxyDecision: true }, + { shouldSkip: false, expectedStatus: 404, delayedSkipProxyDecision: false } ]; OUTCOMES.forEach(function (outcome) { describe('and returns ' + outcome.shouldSkip, function () { it('express-http-proxy' + (outcome.shouldSkip ? ' skips ' : ' doesnt skip ') + 'to next()', function (done) { + if (outcome.delayedSkipProxyDecision !== undefined) { + app.use(function (req, res, next) { + res.locals.skipProxyDecisionPromise = new Promise(function (resolve) { + setTimeout(function () { + resolve(outcome.delayedSkipProxyDecision); + }, 50); + }); + next(); + }); + } + app.use('/proxy', proxy('http://127.0.0.1:12345', { - skipToNextHandlerFilter: function (/*res*/) { - return outcome.shouldSkip; + skipToNextHandlerFilter: function (proxyRes, userReq, userRes) { + return userRes.locals.skipProxyDecisionPromise || outcome.shouldSkip; } }));