diff --git a/dotcom-rendering/src/server/lib/header-middleware.ts b/dotcom-rendering/src/server/lib/header-middleware.ts new file mode 100644 index 00000000000..bc37b2446d3 --- /dev/null +++ b/dotcom-rendering/src/server/lib/header-middleware.ts @@ -0,0 +1,40 @@ +import type { NextFunction, Request, RequestHandler, Response } from 'express'; + +const getTargetGroupHeaderValue = () => { + if (process.env.NODE_ENV === 'production') { + // See https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-environment-variables.html + return process.env.AWS_EXECUTION_ENV?.startsWith('AWS_ECS_') === true + ? 'ecs' + : 'ec2'; + } + + return 'dev'; +}; + +const getHeaders: () => Record = () => { + const backendApp = process.env.GU_APP ?? 'rendering'; + const targetGroup = getTargetGroupHeaderValue(); + + return { + 'X-Gu-Backend-App': backendApp, + 'X-Gu-Backend-App-Target-Group': targetGroup, + }; +}; + +/** + * Middleware to add response headers useful for debugging. + * + * @see https://expressjs.com/en/guide/using-middleware + */ +export const responseHeaderMiddleware: RequestHandler = ( + req: Request, + res: Response, + next: NextFunction, +) => { + const headers = getHeaders(); + + for (const [key, value] of Object.entries(headers)) { + res.setHeader(key, value); + } + next(); +}; diff --git a/dotcom-rendering/src/server/server.dev.ts b/dotcom-rendering/src/server/server.dev.ts index a8915867297..0e7e9f5f440 100644 --- a/dotcom-rendering/src/server/server.dev.ts +++ b/dotcom-rendering/src/server/server.dev.ts @@ -28,6 +28,7 @@ import { import { handleAppsThrasher } from './handler.thrasher.apps'; import { getABTestsFromQueryParams } from './lib/get-abtests-from-query-params'; import { getContentFromURLMiddleware } from './lib/get-content-from-url'; +import { responseHeaderMiddleware } from './lib/header-middleware'; import { requestLoggerMiddleware } from './lib/logging-middleware'; import { recordError } from './lib/logging-store'; @@ -105,6 +106,8 @@ const renderer = Router(); renderer.use(getContentFromURLMiddleware); renderer.use(getABTestsFromQueryParams); renderer.use(requestLoggerMiddleware); +renderer.use(responseHeaderMiddleware); + renderer.get('/Article/*url', handleArticle); renderer.get('/Interactive/*url', handleInteractive); renderer.get('/Blocks/*url', handleBlocks); diff --git a/dotcom-rendering/src/server/server.prod.ts b/dotcom-rendering/src/server/server.prod.ts index db44443d436..62b75a3b639 100644 --- a/dotcom-rendering/src/server/server.prod.ts +++ b/dotcom-rendering/src/server/server.prod.ts @@ -28,6 +28,7 @@ import { } from './handler.sportDataPage'; import { handleAppsThrasher } from './handler.thrasher.apps'; import { recordBaselineCloudWatchMetrics } from './lib/aws/metrics-baseline'; +import { responseHeaderMiddleware } from './lib/header-middleware'; import { logger } from './lib/logging'; import { requestLoggerMiddleware } from './lib/logging-middleware'; import { recordError } from './lib/logging-store'; @@ -40,6 +41,7 @@ export const prodServer = (): void => { app.use(express.json({ limit: '50mb' })); app.use(requestLoggerMiddleware); app.use(compression()); + app.use(responseHeaderMiddleware); app.get('/_healthcheck', (req: Request, res: Response) => { res.status(200).send('OKAY');