diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index ffb2ed966881..4a0a431157d8 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -412,6 +412,7 @@ export function requestHandler( }) .then(null, e => { logger.error(e); + _end.call(this, chunk, encoding, cb); }); }; } diff --git a/packages/node/test/handlers.test.ts b/packages/node/test/handlers.test.ts index 2fd83094bf13..f0959de22132 100644 --- a/packages/node/test/handlers.test.ts +++ b/packages/node/test/handlers.test.ts @@ -3,6 +3,7 @@ import { Hub } from '@sentry/hub'; import * as sentryHub from '@sentry/hub'; import { Transaction } from '@sentry/tracing'; import { Runtime } from '@sentry/types'; +import { SentryError } from '@sentry/utils'; import * as http from 'http'; import * as net from 'net'; @@ -16,6 +17,7 @@ import { requestHandler, tracingHandler, } from '../src/handlers'; +import * as SDK from '../src/sdk'; describe('parseRequest', () => { let mockReq: { [key: string]: any }; @@ -281,6 +283,31 @@ describe('requestHandler', () => { done(); }); }); + + it('patches `res.end` when `flushTimeout` is specified', () => { + const flush = jest.spyOn(SDK, 'flush').mockResolvedValue(true); + + const sentryRequestMiddleware = requestHandler({ flushTimeout: 1337 }); + sentryRequestMiddleware(req, res, next); + res.end('ok'); + + setImmediate(() => { + expect(flush).toHaveBeenCalledWith(1337); + expect(res.finished).toBe(true); + }); + }); + + it('prevents errors thrown during `flush` from breaking the response', async () => { + jest.spyOn(SDK, 'flush').mockRejectedValue(new SentryError('HTTP Error (429)')); + + const sentryRequestMiddleware = requestHandler({ flushTimeout: 1337 }); + sentryRequestMiddleware(req, res, next); + res.end('ok'); + + setImmediate(() => { + expect(res.finished).toBe(true); + }); + }); }); describe('tracingHandler', () => {