From 0e1e68f47c0bb90279fdd91883eee2ccea69857c Mon Sep 17 00:00:00 2001 From: Eran Hammer Date: Wed, 1 Jan 2014 23:41:06 -0800 Subject: [PATCH] Support reply(err, result). Closes #1280 --- lib/handler.js | 11 ++++++----- test/integration/ext.js | 19 ++++++++++++++++++- test/integration/response.js | 23 +++++++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/lib/handler.js b/lib/handler.js index 2b3d1692e..d0ac097f4 100755 --- a/lib/handler.js +++ b/lib/handler.js @@ -102,14 +102,14 @@ internals.replyInterface = function (request, finalize, base) { finalize = Utils.once(finalize); - var root = function (result) { + var root = function (err, result) { - return internals.wrap(result, request, finalize); + return internals.wrap(err || result, request, finalize); }; var reply = base || root; if (base) { - base.root = root; + base._root = root; } var viewsManager = (base && base.env && base.env.views) || request._route.env.views || request.server._views; @@ -343,9 +343,10 @@ exports.invoke = function (request, event, callback) { Ext.runProtected(request, event, next, function (enter, exit) { - var finalize = function (result) { + var finalize = function (err, result) { - return (result === undefined ? exit() : reply.root(result)); + result = err || result; + return (result === undefined ? exit() : reply._root(result)); }; finalize.env = ext.env; diff --git a/test/integration/ext.js b/test/integration/ext.js index 5db7e759a..b012bbdca 100755 --- a/test/integration/ext.js +++ b/test/integration/ext.js @@ -39,6 +39,23 @@ describe('Ext', function () { }); }); + it('replies with error using reply(null, result)', function (done) { + + var server = new Hapi.Server(); + server.ext('onRequest', function (request, next) { + + return next(null, Hapi.error.badRequest('boom')); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('ok'); } }); + + server.inject({ method: 'GET', url: '/' }, function (res) { + + expect(res.result.message).to.equal('boom'); + done(); + }); + }); + it('replies with a view', function (done) { var server = new Hapi.Server({ @@ -92,7 +109,7 @@ describe('Ext', function () { var server = new Hapi.Server(); server.ext('onPreResponse', function (request, next) { - return next(request.response().response.statusCode); + return next(null, request.response().response.statusCode); }); server.inject({ method: 'GET', url: '/missing' }, function (res) { diff --git a/test/integration/response.js b/test/integration/response.js index 6e37299ec..77a0dcd5e 100755 --- a/test/integration/response.js +++ b/test/integration/response.js @@ -374,6 +374,29 @@ describe('Response', function () { done(); }); }); + + it('uses reply(null, result) for result', function (done) { + + var server = new Hapi.Server(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { reply(null, 'steve'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('steve'); + done(); + }); + }); + + it('uses reply(null, err) for err', function (done) { + + var server = new Hapi.Server(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { reply(null, Hapi.error.badRequest()); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); }); describe('Buffer', function () {