Skip to content

Commit 0014f64

Browse files
Emit late abort errors
1 parent d4f93d8 commit 0014f64

2 files changed

Lines changed: 54 additions & 7 deletions

File tree

lib/request.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -507,14 +507,9 @@ exports = module.exports = internals.Request = class {
507507

508508
this._eventContext.request = null; // Disable req events
509509

510-
if (this.response._close) {
511-
if (this.response.statusCode === 500 &&
512-
this.response._error) {
513-
514-
const tags = this.response._error.isDeveloperError ? ['internal', 'implementation', 'error'] : ['internal', 'error'];
515-
this._log(tags, this.response._error, 'error');
516-
}
510+
this._logErrorResponse(this.response);
517511

512+
if (this.response._close) {
518513
this.response._close();
519514
}
520515

@@ -538,6 +533,7 @@ exports = module.exports = internals.Request = class {
538533
}
539534

540535
if (this.info.completed) {
536+
this._logErrorResponse(response);
541537
response._close?.();
542538

543539
return;
@@ -546,6 +542,20 @@ exports = module.exports = internals.Request = class {
546542
this.response = response;
547543
}
548544

545+
_logErrorResponse(response) {
546+
547+
const error = response._error ?? (Boom.isBoom(response) ? response : null);
548+
const statusCode = response.statusCode ?? response.output?.statusCode;
549+
if (statusCode !== 500 ||
550+
!error) {
551+
552+
return;
553+
}
554+
555+
const tags = error.isDeveloperError ? ['internal', 'implementation', 'error'] : ['internal', 'error'];
556+
this._log(tags, error, 'error');
557+
}
558+
549559
_setState(name, value, options) {
550560

551561
const state = { name, value };

test/request.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,43 @@ describe('Request', () => {
766766
await server.stop();
767767
});
768768

769+
it('emits request-error when handler fails after abort', { retry: true }, async (flags) => {
770+
771+
const server = Hapi.server({ debug: false });
772+
const team = new Teamwork.Team();
773+
774+
const handler = async (request) => {
775+
776+
clientRequest.destroy();
777+
await Hoek.wait(10);
778+
team.attend();
779+
throw new Error('late failure');
780+
};
781+
782+
server.route({ method: 'GET', path: '/', handler });
783+
784+
const log = server.events.once({ name: 'request', channels: 'error' });
785+
786+
await server.start();
787+
flags.onCleanup = () => server.stop();
788+
789+
const clientRequest = Http.request({
790+
hostname: 'localhost',
791+
port: server.info.port,
792+
method: 'GET'
793+
});
794+
795+
clientRequest.on('error', Hoek.ignore);
796+
clientRequest.end();
797+
798+
await team.work;
799+
800+
const [, event] = await log;
801+
expect(event.error.message).to.equal('late failure');
802+
803+
await server.stop();
804+
});
805+
769806
it('does not fail on abort (onPreHandler)', async () => {
770807

771808
const server = Hapi.server();

0 commit comments

Comments
 (0)