Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 20 additions & 6 deletions lib/reply.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,28 +64,42 @@ internals.Reply.prototype.decorate = function (property, method) {

internals.Reply.prototype.interface = function (request, realm, options, next) { // next(err || response, data);

const reply = (err, response, data) => {
let reply = (err, response, data) => {

Hoek.assert(data === undefined || options.data, 'Reply interface does not allow a third argument');

reply._data = data; // Held for later
return reply.response(err !== null && err !== undefined ? err : response);
};

const domain = request.domain;

if (domain) {
reply = domain.bind(reply);

reply.close = domain.bind(internals.close);
reply.continue = domain.bind(internals.continue);
reply.redirect = domain.bind(internals.redirect);
reply.response = domain.bind(internals.response);
reply.entity = domain.bind(internals.entity);
}
else {
reply.close = internals.close;
reply.continue = internals.continue;
reply.redirect = internals.redirect;
reply.response = internals.response;
reply.entity = internals.entity;
}

reply._settings = options;
reply._replied = false;
reply._next = Hoek.once(next);

reply.realm = realm;
reply.request = request;

reply.close = internals.close;
reply.continue = internals.continue;
reply.state = internals.state;
reply.unstate = internals.unstate;
reply.redirect = internals.redirect;
reply.response = internals.response;
reply.entity = internals.entity;

if (this._decorations) {
const methods = Object.keys(this._decorations);
Expand Down
42 changes: 42 additions & 0 deletions test/handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,48 @@ describe('handler', () => {
});
});

it('returns 500 if prerequisite loses domain binding', (done) => {

const pre1 = function (request, reply) {

Promise.resolve().then(() => {

reply('Hello');
});
};

const pre2 = function (request, reply) {

a.b.c = 0;
};

const handler = function (request, reply) {

return reply(request.pre.m1);
};


const server = new Hapi.Server({ debug: false });
server.connection();
server.route({
method: 'GET',
path: '/',
config: {
pre: [
[{ method: pre1, assign: 'm1' }],
{ method: pre2, assign: 'm2' }
],
handler
}
});

server.inject('/', (res) => {

expect(res.result.statusCode).to.equal(500);
done();
});
});

it('returns a user record using server method', (done) => {

const server = new Hapi.Server();
Expand Down