diff --git a/lib/transmit.js b/lib/transmit.js index 38c9e0cf2..976df66af 100755 --- a/lib/transmit.js +++ b/lib/transmit.js @@ -110,7 +110,7 @@ internals.marshal = function (request, next) { internals.fail = function (request, boom, callback) { - const error = boom.output; + const error = Hoek.clone(boom.output); const response = new Response(error.payload, request); response._error = boom; response.code(error.statusCode); diff --git a/test/transmit.js b/test/transmit.js index 8c7f88863..8b2b5c84c 100755 --- a/test/transmit.js +++ b/test/transmit.js @@ -1400,6 +1400,90 @@ describe('transmission', () => { }); }); + it('boom object reused does not affect encoding header.', (done) => { + + const error = Boom.badRequest(); + const data = JSON.stringify({ + statusCode: error.output.statusCode, + error: error.message + }); + + const server = new Hapi.Server(); + server.connection(); + + const handler = function (request, reply) { + + return reply(error); + }; + + server.route({ method: 'GET', path: '/', handler }); + server.start((err) => { + + expect(err).to.not.exist(); + + const uri = 'http://localhost:' + server.info.port; + + Zlib.gzip(new Buffer(data), (err, zipped) => { + + expect(err).to.not.exist(); + + Wreck.get(uri, { headers: { 'accept-encoding': 'gzip' } }, (err, res, body) => { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(zipped.toString()); + + Wreck.get(uri, { headers: { 'accept-encoding': 'gzip' } }, (err2, res2, body2) => { + + expect(err2).to.not.exist(); + expect(body2.toString()).to.equal(zipped.toString()); + server.stop(done); + }); + }); + }); + }); + }); + + it('Error reused does not affect encoding header.', (done) => { + + const error = new Error('something went wrong'); + const wrappedError = Boom.wrap(error); + const data = JSON.stringify(wrappedError.output.payload); + + const server = new Hapi.Server(); + server.connection(); + + const handler = function (request, reply) { + + return reply(error); + }; + + server.route({ method: 'GET', path: '/', handler }); + server.start((err) => { + + expect(err).to.not.exist(); + + const uri = 'http://localhost:' + server.info.port; + + Zlib.gzip(new Buffer(data), (err, zipped) => { + + expect(err).to.not.exist(); + + Wreck.get(uri, { headers: { 'accept-encoding': 'gzip' } }, (err, res, body) => { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(zipped.toString()); + + Wreck.get(uri, { headers: { 'accept-encoding': 'gzip' } }, (err2, res2, body2) => { + + expect(err2).to.not.exist(); + expect(body2.toString()).to.equal(zipped.toString()); + server.stop(done); + }); + }); + }); + }); + }); + it('returns an identity response on a post request when accept-encoding is missing', (done) => { const data = '{"test":"true"}';