From 226f344f2c42251d1322aabc2322a2ac79572f5f Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:43:55 -0800 Subject: [PATCH 01/11] feat(platform-express): end abstraction --- packages/platform-express/adapters/express-adapter.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/platform-express/adapters/express-adapter.ts b/packages/platform-express/adapters/express-adapter.ts index bb2ae7337cb..6e04895b528 100644 --- a/packages/platform-express/adapters/express-adapter.ts +++ b/packages/platform-express/adapters/express-adapter.ts @@ -60,6 +60,10 @@ export class ExpressAdapter extends AbstractHttpAdapter { return response.status(statusCode); } + public end(response: any, message?: string) { + return response.end(message !== undefined ? String(message) : undefined); + } + public render(response: any, view: string, options: any) { return response.render(view, options); } From 0e05de58e462fe9b07b3e526a1ab616ea59dcf9b Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:44:29 -0800 Subject: [PATCH 02/11] feat(platform-express): header sent abstraction --- packages/platform-express/adapters/express-adapter.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/platform-express/adapters/express-adapter.ts b/packages/platform-express/adapters/express-adapter.ts index 6e04895b528..d6456310072 100644 --- a/packages/platform-express/adapters/express-adapter.ts +++ b/packages/platform-express/adapters/express-adapter.ts @@ -80,6 +80,10 @@ export class ExpressAdapter extends AbstractHttpAdapter { return this.use(handler); } + public isHeadersSent(response: any): boolean { + return response.headersSent; + } + public setHeader(response: any, name: string, value: string) { return response.set(name, value); } From 24ee43b2546f09329e348802b88bf11009d8e434 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:45:10 -0800 Subject: [PATCH 03/11] feat(platform-fastify): end abstraction --- packages/platform-fastify/adapters/fastify-adapter.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/platform-fastify/adapters/fastify-adapter.ts b/packages/platform-fastify/adapters/fastify-adapter.ts index 77ac6ae1619..14f95cb02d0 100644 --- a/packages/platform-fastify/adapters/fastify-adapter.ts +++ b/packages/platform-fastify/adapters/fastify-adapter.ts @@ -300,6 +300,10 @@ export class FastifyAdapter< return (response as TReply).code(statusCode); } + public end(response: TReply, message?: string) { + response.raw.end(message !== undefined ? String(message) : undefined); + } + public render( response: TReply & { view: Function }, view: string, From b8fb518e61b1f99232e46efc90c75a96a71971c4 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:45:23 -0800 Subject: [PATCH 04/11] feat(platform-fastify): header sent abstraction --- packages/platform-fastify/adapters/fastify-adapter.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/platform-fastify/adapters/fastify-adapter.ts b/packages/platform-fastify/adapters/fastify-adapter.ts index 14f95cb02d0..0e4a169016a 100644 --- a/packages/platform-fastify/adapters/fastify-adapter.ts +++ b/packages/platform-fastify/adapters/fastify-adapter.ts @@ -388,6 +388,10 @@ export class FastifyAdapter< ); } + public isHeadersSent(response: TReply): boolean { + return response.sent; + } + public setHeader(response: TReply, name: string, value: string) { return response.header(name, value); } From 26c21fb2014afcb25688cbdbead93ec0cf9b1141 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:46:01 -0800 Subject: [PATCH 05/11] feat(common): end abstraction --- packages/common/interfaces/http/http-server.interface.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/common/interfaces/http/http-server.interface.ts b/packages/common/interfaces/http/http-server.interface.ts index b85595c41e2..9301fad363a 100644 --- a/packages/common/interfaces/http/http-server.interface.ts +++ b/packages/common/interfaces/http/http-server.interface.ts @@ -50,6 +50,7 @@ export interface HttpServer { listen(port: number | string, hostname: string, callback?: () => void): any; reply(response: any, body: any, statusCode?: number): any; status(response: any, statusCode: number): any; + end(response: any, message?: string): any; render(response: any, view: string, options: any): any; redirect(response: any, statusCode: number, url: string): any; setHeader(response: any, name: string, value: string): any; From 95bba80ecbecd53d21c735a278b2f48215df1659 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:46:09 -0800 Subject: [PATCH 06/11] feat(common): header sent abstraction --- packages/common/interfaces/http/http-server.interface.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/common/interfaces/http/http-server.interface.ts b/packages/common/interfaces/http/http-server.interface.ts index 9301fad363a..9d91a97ff3b 100644 --- a/packages/common/interfaces/http/http-server.interface.ts +++ b/packages/common/interfaces/http/http-server.interface.ts @@ -53,6 +53,7 @@ export interface HttpServer { end(response: any, message?: string): any; render(response: any, view: string, options: any): any; redirect(response: any, statusCode: number, url: string): any; + isHeadersSent(response: any): boolean; setHeader(response: any, name: string, value: string): any; setErrorHandler?(handler: Function, prefix?: string): any; setNotFoundHandler?(handler: Function, prefix?: string): any; From 1b684bcc0a2d41e00f21edb4c313d95b4710bfb6 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:46:24 -0800 Subject: [PATCH 07/11] feat(core): end abstraction --- packages/core/adapters/http-adapter.ts | 1 + packages/core/test/utils/noop-adapter.spec.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/core/adapters/http-adapter.ts b/packages/core/adapters/http-adapter.ts index b5379933aeb..5fda97b7632 100644 --- a/packages/core/adapters/http-adapter.ts +++ b/packages/core/adapters/http-adapter.ts @@ -105,6 +105,7 @@ export abstract class AbstractHttpAdapter< abstract getRequestUrl(request); abstract status(response, statusCode: number); abstract reply(response, body: any, statusCode?: number); + abstract end(response, message?: string); abstract render(response, view: string, options: any); abstract redirect(response, statusCode: number, url: string); abstract setErrorHandler(handler: Function, prefix?: string); diff --git a/packages/core/test/utils/noop-adapter.spec.ts b/packages/core/test/utils/noop-adapter.spec.ts index c2e73d09fd6..0449f03fa23 100644 --- a/packages/core/test/utils/noop-adapter.spec.ts +++ b/packages/core/test/utils/noop-adapter.spec.ts @@ -13,6 +13,7 @@ export class NoopHttpAdapter extends AbstractHttpAdapter { getRequestMethod(request: any): any {} getRequestUrl(request: any): any {} reply(response: any, body: any): any {} + end(response: any, message?: any): any {} status(response: any, statusCode: number): any {} render(response: any, view: string, options: any): any {} redirect(response: any, statusCode: number, url: string) {} From fefa7528fa28377ed40f27892c35333e67aefb48 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:46:39 -0800 Subject: [PATCH 08/11] feat(core): header sent abstraction --- packages/core/adapters/http-adapter.ts | 1 + packages/core/test/utils/noop-adapter.spec.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/core/adapters/http-adapter.ts b/packages/core/adapters/http-adapter.ts index 5fda97b7632..c5d778c1345 100644 --- a/packages/core/adapters/http-adapter.ts +++ b/packages/core/adapters/http-adapter.ts @@ -110,6 +110,7 @@ export abstract class AbstractHttpAdapter< abstract redirect(response, statusCode: number, url: string); abstract setErrorHandler(handler: Function, prefix?: string); abstract setNotFoundHandler(handler: Function, prefix?: string); + abstract isHeadersSent(response); abstract setHeader(response, name: string, value: string); abstract registerParserMiddleware(prefix?: string); abstract enableCors( diff --git a/packages/core/test/utils/noop-adapter.spec.ts b/packages/core/test/utils/noop-adapter.spec.ts index 0449f03fa23..67eafa54e09 100644 --- a/packages/core/test/utils/noop-adapter.spec.ts +++ b/packages/core/test/utils/noop-adapter.spec.ts @@ -19,6 +19,7 @@ export class NoopHttpAdapter extends AbstractHttpAdapter { redirect(response: any, statusCode: number, url: string) {} setErrorHandler(handler: Function, prefix = '/'): any {} setNotFoundHandler(handler: Function, prefix = '/'): any {} + isHeadersSent(response: any): any {} setHeader(response: any, name: string, value: string): any {} registerParserMiddleware(): any {} enableCors(options: any): any {} From a03db87146ec2f909b8ce7f287baaa39d33d0833 Mon Sep 17 00:00:00 2001 From: wSedlacek Date: Sat, 4 Dec 2021 00:47:30 -0800 Subject: [PATCH 09/11] fix(core): end without message when a response has already sent a header --- .../core/exceptions/base-exception-filter.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/core/exceptions/base-exception-filter.ts b/packages/core/exceptions/base-exception-filter.ts index ea360e84a69..bc378450120 100644 --- a/packages/core/exceptions/base-exception-filter.ts +++ b/packages/core/exceptions/base-exception-filter.ts @@ -38,7 +38,12 @@ export class BaseExceptionFilter implements ExceptionFilter { message: res, }; - applicationRef.reply(host.getArgByIndex(1), message, exception.getStatus()); + const response = host.getArgByIndex(1); + if (!applicationRef.isHeadersSent(response)) { + applicationRef.reply(response, message, exception.getStatus()); + } else { + applicationRef.end(response); + } } public handleUnknownError( @@ -55,7 +60,14 @@ export class BaseExceptionFilter implements ExceptionFilter { statusCode: HttpStatus.INTERNAL_SERVER_ERROR, message: MESSAGES.UNKNOWN_EXCEPTION_MESSAGE, }; - applicationRef.reply(host.getArgByIndex(1), body, body.statusCode); + + const response = host.getArgByIndex(1); + if (!applicationRef.isHeadersSent(response)) { + applicationRef.reply(response, body, body.statusCode); + } else { + applicationRef.end(response); + } + if (this.isExceptionObject(exception)) { return BaseExceptionFilter.logger.error( exception.message, From 5e127fc67399d34109761b92044f59fca4e717e4 Mon Sep 17 00:00:00 2001 From: Kamil Mysliwiec Date: Fri, 13 May 2022 12:46:22 +0200 Subject: [PATCH 10/11] Update packages/platform-express/adapters/express-adapter.ts Co-authored-by: Micael Levi L. Cavalcante --- packages/platform-express/adapters/express-adapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/platform-express/adapters/express-adapter.ts b/packages/platform-express/adapters/express-adapter.ts index d6456310072..4717a3e8f68 100644 --- a/packages/platform-express/adapters/express-adapter.ts +++ b/packages/platform-express/adapters/express-adapter.ts @@ -61,7 +61,7 @@ export class ExpressAdapter extends AbstractHttpAdapter { } public end(response: any, message?: string) { - return response.end(message !== undefined ? String(message) : undefined); + return response.end(message); } public render(response: any, view: string, options: any) { From 3f8a6c96d85a4a47b76b24f8b6da253f273a2274 Mon Sep 17 00:00:00 2001 From: Kamil Mysliwiec Date: Mon, 23 May 2022 08:36:43 +0200 Subject: [PATCH 11/11] Update packages/platform-fastify/adapters/fastify-adapter.ts Co-authored-by: Micael Levi L. Cavalcante --- packages/platform-fastify/adapters/fastify-adapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/platform-fastify/adapters/fastify-adapter.ts b/packages/platform-fastify/adapters/fastify-adapter.ts index 0e4a169016a..4ac3f72ee57 100644 --- a/packages/platform-fastify/adapters/fastify-adapter.ts +++ b/packages/platform-fastify/adapters/fastify-adapter.ts @@ -301,7 +301,7 @@ export class FastifyAdapter< } public end(response: TReply, message?: string) { - response.raw.end(message !== undefined ? String(message) : undefined); + response.raw.end(message); } public render(