From 2fadd5a6c06dc9023f803a01a96820d8228c145c Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 20 Apr 2023 17:10:11 +0200 Subject: [PATCH] fix(replay): Ensure we still truncate large bodies if they are failed JSON Also add some tests around this. --- .../src/coreHandlers/util/networkUtils.ts | 4 +-- .../coreHandlers/util/networkUtils.test.ts | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/replay/src/coreHandlers/util/networkUtils.ts b/packages/replay/src/coreHandlers/util/networkUtils.ts index 6ff4a6ce27d9..79515bf36ff4 100644 --- a/packages/replay/src/coreHandlers/util/networkUtils.ts +++ b/packages/replay/src/coreHandlers/util/networkUtils.ts @@ -201,8 +201,8 @@ function normalizeNetworkBody(body: string | undefined): { }; } catch { return { - body, - warnings: ['INVALID_JSON'], + body: exceedsSizeLimit ? `${body.slice(0, NETWORK_BODY_MAX_SIZE)}…` : body, + warnings: exceedsSizeLimit ? ['INVALID_JSON', 'TEXT_TRUNCATED'] : ['INVALID_JSON'], }; } } diff --git a/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts b/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts index f187fbe59de0..2fcafbe98669 100644 --- a/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts +++ b/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts @@ -1,5 +1,6 @@ import { TextEncoder } from 'util'; +import { NETWORK_BODY_MAX_SIZE } from '../../../../src/constants'; import { buildNetworkRequestOrResponse, getBodySize, @@ -186,5 +187,36 @@ describe('Unit | coreHandlers | util | networkUtils', () => { expect(actual).toEqual({ size: 1, headers: {}, body: expectedBody, _meta: expectedMeta }); }); + + it.each([ + [ + 'large JSON string', + JSON.stringify({ + aa: 'a'.repeat(NETWORK_BODY_MAX_SIZE + 10), + }), + { + aa: `${'a'.repeat(NETWORK_BODY_MAX_SIZE - 7)}~~`, + }, + { warnings: ['JSON_TRUNCATED'] }, + ], + [ + 'large plain string', + 'a'.repeat(NETWORK_BODY_MAX_SIZE + 10), + `${'a'.repeat(NETWORK_BODY_MAX_SIZE)}…`, + { warnings: ['TEXT_TRUNCATED'] }, + ], + [ + 'large invalid JSON string', + `{--${JSON.stringify({ + aa: 'a'.repeat(NETWORK_BODY_MAX_SIZE + 10), + })}`, + `{--{"aa":"${'a'.repeat(NETWORK_BODY_MAX_SIZE - 10)}…`, + { warnings: ['INVALID_JSON', 'TEXT_TRUNCATED'] }, + ], + ])('works with %s', (label, input, expectedBody, expectedMeta) => { + const actual = buildNetworkRequestOrResponse({}, 1, input); + + expect(actual).toEqual({ size: 1, headers: {}, body: expectedBody, _meta: expectedMeta }); + }); }); });