Skip to content

Commit 25072a8

Browse files
committed
preserve encoded values
1 parent 35a1352 commit 25072a8

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

dev-packages/node-integration-tests/suites/express/tracing/withError/test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,21 @@ describe('express tracing with error', () => {
2626
runner.makeRequest('get', '/test/123/abc?q=1');
2727
await runner.completed();
2828
});
29+
30+
test('preserves encoded query parameters while filtering sensitive values on events', async () => {
31+
const runner = createRunner()
32+
.ignore('transaction')
33+
.expect({
34+
event: {
35+
request: {
36+
query_string: 'q=hello%20world&token=[Filtered]',
37+
},
38+
},
39+
})
40+
.start();
41+
42+
await runner.makeRequest('get', '/test/123/abc?q=hello%20world&token=secret');
43+
await runner.completed();
44+
});
2945
});
3046
});

packages/core/src/integrations/requestdata.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { IntegrationFn } from '../types/integration';
88
import type { QueryParams, RequestEventData } from '../types/request';
99
import type { StreamedSpanJSON } from '../types/span';
1010
import { parseCookie } from '../utils/cookie';
11-
import { SENSITIVE_COOKIE_NAME_SNIPPETS } from '../utils/data-collection/filtering-snippets';
11+
import { FILTERED_VALUE, SENSITIVE_COOKIE_NAME_SNIPPETS } from '../utils/data-collection/filtering-snippets';
1212
import { filterKeyValueData } from '../utils/data-collection/filterKeyValueData';
1313
import { filterQueryParams } from '../utils/data-collection/filterQueryParams';
1414
import { httpHeadersToSpanAttributes } from '../utils/request';
@@ -263,8 +263,14 @@ function filterQueryString(queryString: QueryParams, behavior: CollectBehavior):
263263
return filtered;
264264
}
265265

266-
const result = Object.entries(filtered)
267-
.map(([key, value]) => `${key}=${value}`)
266+
const result = normalized
267+
.split('&')
268+
.map(pair => {
269+
const [key] = pair.split('=', 1);
270+
const normalizedKey = new URLSearchParams(pair).keys().next().value;
271+
272+
return normalizedKey && filtered[normalizedKey] === FILTERED_VALUE ? `${key}=${FILTERED_VALUE}` : pair;
273+
})
268274
.join('&');
269275
return result || undefined;
270276
}

packages/core/test/lib/integrations/requestdata.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,19 @@ describe('requestDataIntegration', () => {
600600
expect(event.request?.query_string).toBe('page=1&token=[Filtered]');
601601
});
602602

603+
it('preserves encoded query parameter values while filtering sensitive parameters', () => {
604+
const integration = requestDataIntegration();
605+
const event: Event = {
606+
sdkProcessingMetadata: {
607+
normalizedRequest: { query_string: 'q=hello%20world&token=secret' },
608+
},
609+
};
610+
611+
integration.processEvent?.(event, {}, mockClient(false));
612+
613+
expect(event.request?.query_string).toBe('q=hello%20world&token=[Filtered]');
614+
});
615+
603616
it('preserves the configured query allowlist when include.query_string is true', () => {
604617
const integration = requestDataIntegration({ include: { query_string: true } });
605618
const event: Event = {

0 commit comments

Comments
 (0)