diff --git a/packages/logging-interceptor/src/logging.interceptor.ts b/packages/logging-interceptor/src/logging.interceptor.ts index 1ed8b2b1..729bdb48 100644 --- a/packages/logging-interceptor/src/logging.interceptor.ts +++ b/packages/logging-interceptor/src/logging.interceptor.ts @@ -288,10 +288,19 @@ export class LoggingInterceptor implements NestInterceptor { } if (typeof mask === 'function') { - return { - ...maskedHeaders, - [headerKey]: mask(headerValue), - }; + try { + return { + ...maskedHeaders, + [headerKey]: mask(headerValue), + }; + } catch (err) { + this.logger.warn(`LoggingInterceptor - Masking error for header ${headerKey}`, err); + + return { + ...maskedHeaders, + [headerKey]: this.maskingPlaceholder, + }; + } } return maskedHeaders; diff --git a/packages/logging-interceptor/test/logging.interceptor.test.ts b/packages/logging-interceptor/test/logging.interceptor.test.ts index 08cb330d..cdc69131 100644 --- a/packages/logging-interceptor/test/logging.interceptor.test.ts +++ b/packages/logging-interceptor/test/logging.interceptor.test.ts @@ -470,5 +470,22 @@ describe('Logging interceptor', () => { expect(logSpy.mock.calls[0][0].headers.authorization).toBeUndefined(); }); + + it('should not fail if the masking function throws an error and mask the whole header as fallback', async () => { + const interceptor = app.get(ApplicationConfig).getGlobalInterceptors()[0] as LoggingInterceptor; + interceptor.setMask({ + requestHeader: { + authorization: () => { + throw new Error('This is an error'); + }, + }, + }); + const logSpy: jest.SpyInstance = jest.spyOn(Logger.prototype, 'log'); + const url: string = `/cats/ok`; + + await request(app.getHttpServer()).get(url).set('authorization', 'Bearer JWT').expect(HttpStatus.OK); + + expect(logSpy.mock.calls[0][0].headers.authorization).toBe(placeholder); + }); }); });