diff --git a/lib/server-app.js b/lib/server-app.js index 6bba947dd..98e46824d 100644 --- a/lib/server-app.js +++ b/lib/server-app.js @@ -221,12 +221,15 @@ proto.middleware = function(name, paths, handler) { */ proto._findLayerByHandler = function(handler) { // Other handlers can be added to the stack, for example, - // NewRelic adds sentinel handler. We need to search the stack + // NewRelic adds sentinel handler, and AppDynamics adds + // some additional proxy info. We need to search the stack for (var k = this._router.stack.length - 1; k >= 0; k--) { - if (this._router.stack[k].handle === handler || - // NewRelic replaces the handle and keeps it as __NR_original - this._router.stack[k].handle['__NR_original'] === handler - ) { + const isOriginal = this._router.stack[k].handle === handler; + const isNewRelic = this._router.stack[k].handle['__NR_original'] === handler; + const isAppDynamics = this._router.stack[k].handle['__appdynamicsProxyInfo__'] && + this._router.stack[k].handle['__appdynamicsProxyInfo__']['orig'] === handler; + + if (isOriginal || isNewRelic || isAppDynamics) { return this._router.stack[k]; } else { // Aggressively check if the original handler has been wrapped diff --git a/test/app.test.js b/test/app.test.js index f9e6843f7..93214bfe0 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -124,6 +124,28 @@ describe('app', function() { }); }); + it('allows handlers to be wrapped as __appdynamicsProxyInfo__ on express stack', + function(done) { + var myHandler = namedHandler('my-handler'); + var wrappedHandler = function(req, res, next) { + myHandler(req, res, next); + }; + wrappedHandler['__appdynamicsProxyInfo__'] = { + orig: myHandler, + }; + app.middleware('routes:before', wrappedHandler); + var found = app._findLayerByHandler(myHandler); + expect(found).to.be.an('object'); + expect(found).have.property('phase', 'routes:before'); + executeMiddlewareHandlers(app, function(err) { + if (err) return done(err); + + expect(steps).to.eql(['my-handler']); + + done(); + }); + }); + it('allows handlers to be wrapped as a property on express stack', function(done) { var myHandler = namedHandler('my-handler');