Skip to content

Commit 6f7207d

Browse files
committed
fix middleware to work for various article types
1 parent 6873444 commit 6f7207d

File tree

1 file changed

+36
-30
lines changed

1 file changed

+36
-30
lines changed

dotcom-rendering/src/server/lib/get-abtests-from-query-params.ts

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,52 @@
1+
import { isObject } from '@guardian/libs';
12
import type { Handler } from 'express';
2-
import { validateAsFEArticle } from '../../model/validate';
33
import { logger } from './logging';
44

5+
type AbServerSideTestType = {
6+
config: {
7+
serverSideABTests?: Record<string, string>;
8+
};
9+
};
10+
511
const SAFE_AB_VALUE = /^[a-zA-Z0-9_-]+$/;
612
const MAX_LENGTH = 100;
713

8-
export const getABTestsFromQueryParams: Handler = async (req, res, next) => {
14+
export const getABTestsFromQueryParams: Handler = (req, res, next) => {
915
try {
10-
const frontendData = validateAsFEArticle(req.body);
11-
const { config } = frontendData;
12-
const queryParamsAb = req.query;
13-
const filteredQuery: Record<string, string> = {};
16+
if (isObject(req.body) && isObject(req.body.config)) {
17+
const { config } = req.body as AbServerSideTestType;
18+
const queryParamsAb = req.query;
19+
const filteredQuery: Record<string, string> = {};
1420

15-
for (const [key, value] of Object.entries(queryParamsAb)) {
16-
if (!key.startsWith('ab-') || typeof value !== 'string') {
17-
continue;
18-
}
21+
for (const [key, value] of Object.entries(queryParamsAb)) {
22+
if (!key.startsWith('ab-') || typeof value !== 'string') {
23+
continue;
24+
}
1925

20-
const testId = key.replace(/^ab-/, '');
26+
const testId = key.replace(/^ab-/, '');
2127

22-
if (
23-
testId.length > 0 &&
24-
testId.length <= MAX_LENGTH &&
25-
value.length > 0 &&
26-
value.length <= MAX_LENGTH &&
27-
SAFE_AB_VALUE.test(testId) &&
28-
SAFE_AB_VALUE.test(value)
29-
) {
30-
filteredQuery[testId] = value;
31-
} else {
32-
logger.warn(
33-
`Rejected invalid AB test parameter: ${key}=${value}`,
34-
);
28+
if (
29+
testId.length > 0 &&
30+
testId.length <= MAX_LENGTH &&
31+
value.length > 0 &&
32+
value.length <= MAX_LENGTH &&
33+
SAFE_AB_VALUE.test(testId) &&
34+
SAFE_AB_VALUE.test(value)
35+
) {
36+
filteredQuery[testId] = value;
37+
} else {
38+
logger.warn(
39+
`Rejected invalid AB test parameter: ${key}=${value}`,
40+
);
41+
}
3542
}
43+
config.serverSideABTests = {
44+
...config.serverSideABTests,
45+
...filteredQuery,
46+
};
3647
}
37-
38-
config.serverSideABTests = {
39-
...config.serverSideABTests,
40-
...filteredQuery,
41-
};
42-
req.body = frontendData;
4348
} catch (error) {
49+
logger.error('Error processing AB test query params', error);
4450
return next();
4551
}
4652
next();

0 commit comments

Comments
 (0)