Skip to content

Commit 82c2848

Browse files
authored
Merge pull request #16384 from guardian/aa/response-header
feat: Add headers to understand who responded
2 parents fef1804 + 43ec374 commit 82c2848

3 files changed

Lines changed: 45 additions & 0 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import type { NextFunction, Request, RequestHandler, Response } from 'express';
2+
3+
const getTargetGroupHeaderValue = () => {
4+
if (process.env.NODE_ENV === 'production') {
5+
// See https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-environment-variables.html
6+
return process.env.AWS_EXECUTION_ENV?.startsWith('AWS_ECS_') === true
7+
? 'ecs'
8+
: 'ec2';
9+
}
10+
11+
return 'dev';
12+
};
13+
14+
const getHeaders: () => Record<string, string> = () => {
15+
const backendApp = process.env.GU_APP ?? 'rendering';
16+
const targetGroup = getTargetGroupHeaderValue();
17+
18+
return {
19+
'X-Gu-Backend-App': backendApp,
20+
'X-Gu-Backend-App-Target-Group': targetGroup,
21+
};
22+
};
23+
24+
/**
25+
* Middleware to add response headers useful for debugging.
26+
*
27+
* @see https://expressjs.com/en/guide/using-middleware
28+
*/
29+
export const responseHeaderMiddleware: RequestHandler = (
30+
req: Request,
31+
res: Response,
32+
next: NextFunction,
33+
) => {
34+
const headers = getHeaders();
35+
36+
for (const [key, value] of Object.entries(headers)) {
37+
res.setHeader(key, value);
38+
}
39+
next();
40+
};

dotcom-rendering/src/server/server.dev.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
import { handleAppsThrasher } from './handler.thrasher.apps';
2929
import { getABTestsFromQueryParams } from './lib/get-abtests-from-query-params';
3030
import { getContentFromURLMiddleware } from './lib/get-content-from-url';
31+
import { responseHeaderMiddleware } from './lib/header-middleware';
3132
import { requestLoggerMiddleware } from './lib/logging-middleware';
3233
import { recordError } from './lib/logging-store';
3334

@@ -105,6 +106,8 @@ const renderer = Router();
105106
renderer.use(getContentFromURLMiddleware);
106107
renderer.use(getABTestsFromQueryParams);
107108
renderer.use(requestLoggerMiddleware);
109+
renderer.use(responseHeaderMiddleware);
110+
108111
renderer.get('/Article/*url', handleArticle);
109112
renderer.get('/Interactive/*url', handleInteractive);
110113
renderer.get('/Blocks/*url', handleBlocks);

dotcom-rendering/src/server/server.prod.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
} from './handler.sportDataPage';
2929
import { handleAppsThrasher } from './handler.thrasher.apps';
3030
import { recordBaselineCloudWatchMetrics } from './lib/aws/metrics-baseline';
31+
import { responseHeaderMiddleware } from './lib/header-middleware';
3132
import { logger } from './lib/logging';
3233
import { requestLoggerMiddleware } from './lib/logging-middleware';
3334
import { recordError } from './lib/logging-store';
@@ -40,6 +41,7 @@ export const prodServer = (): void => {
4041
app.use(express.json({ limit: '50mb' }));
4142
app.use(requestLoggerMiddleware);
4243
app.use(compression());
44+
app.use(responseHeaderMiddleware);
4345

4446
app.get('/_healthcheck', (req: Request, res: Response) => {
4547
res.status(200).send('OKAY');

0 commit comments

Comments
 (0)