Skip to content

Commit d76ceb5

Browse files
authored
Preserve original response status on error after write, fix status message. Close #4182 (#4191)
1 parent 75e9014 commit d76ceb5

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

lib/server.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,21 @@ internals.Server = class {
346346
const res = await Shot.inject(needle, settings);
347347
const custom = res.raw.res[Config.symbol];
348348
if (custom) {
349-
res.result = custom.result;
350-
res.request = custom.request;
351349
delete res.raw.res[Config.symbol];
350+
351+
res.request = custom.request;
352+
353+
if (custom.result !== undefined) {
354+
res.result = custom.result;
355+
}
356+
357+
if (custom.statusCode !== undefined) {
358+
res.statusCode = custom.statusCode;
359+
}
360+
361+
if (custom.statusMessage !== undefined) {
362+
res.statusMessage = custom.statusMessage;
363+
}
352364
}
353365

354366
if (res.result === undefined) {

lib/transmit.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ internals.end = function (env, event, err) {
296296
request._setResponse(error);
297297

298298
if (request.raw.res[Config.symbol]) {
299-
request.raw.res.statusCode = error.statusCode;
299+
request.raw.res[Config.symbol].statusCode = error.statusCode;
300+
request.raw.res[Config.symbol].statusMessage = error.source.error;
300301
request.raw.res[Config.symbol].result = error.source; // Force injected response to error
301302
}
302303

test/transmit.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,11 @@ describe('transmission', () => {
725725

726726
const res = await server.inject('/');
727727
expect(res.statusCode).to.equal(500);
728+
expect(res.statusMessage).to.equal('Internal Server Error');
728729
expect(res.result.message).to.equal('An internal server error occurred');
730+
expect(res.raw.res.statusCode).to.equal(200);
731+
expect(res.raw.res.statusMessage).to.equal('OK');
732+
expect(res.rawPayload.toString()).to.equal('success');
729733

730734
const [request] = await log;
731735
expect(request.response.statusCode).to.equal(500);
@@ -747,7 +751,7 @@ describe('transmission', () => {
747751
this.isDone = true;
748752

749753
this.push('something');
750-
this.emit('error', new Error());
754+
setImmediate(() => this.emit('error', new Error()));
751755
};
752756

753757
return stream;
@@ -758,10 +762,11 @@ describe('transmission', () => {
758762
server.route({ method: 'GET', path: '/', handler });
759763

760764
await server.start();
761-
await expect(Wreck.request('GET', 'http://localhost:' + server.info.port + '/')).to.reject();
765+
const err = await expect(Wreck.get('http://localhost:' + server.info.port + '/')).to.reject();
762766
await server.stop();
763767

764768
const [request] = await log;
769+
expect(err.data.res.statusCode).to.equal(200);
765770
expect(request.response.statusCode).to.equal(500);
766771
expect(request.info.completed).to.be.above(0);
767772
expect(request.info.responded).to.equal(0);
@@ -1223,6 +1228,10 @@ describe('transmission', () => {
12231228

12241229
const res = await server.inject({ url: '/stream', headers: { 'Accept-Encoding': 'gzip' } });
12251230
expect(res.statusCode).to.equal(499);
1231+
expect(res.statusMessage).to.equal('Unknown');
1232+
expect(res.raw.res.statusCode).to.equal(204);
1233+
expect(res.raw.res.statusMessage).to.equal('No Content');
1234+
expect(res.rawPayload.toString()).to.equal('here is the response');
12261235

12271236
const [request] = await log;
12281237
expect(request.response.statusCode).to.equal(499);

0 commit comments

Comments
 (0)