Skip to content

Commit 8cec59b

Browse files
committed
fix(event-handler): handle repeated queryString values
1 parent d7303e8 commit 8cec59b

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

packages/event-handler/src/rest/converters.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ const proxyEventV1ToWebRequest = (event: APIGatewayProxyEvent): Request => {
7474
for (const [name, value] of Object.entries(
7575
event.queryStringParameters ?? {}
7676
)) {
77-
if (value != null) url.searchParams.append(name, value);
77+
if (value != null && !event.multiValueQueryStringParameters?.[name]) {
78+
url.searchParams.append(name, value);
79+
}
7880
}
7981

8082
for (const [name, values] of Object.entries(

packages/event-handler/tests/unit/rest/converters.test.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,53 @@ describe('Converters', () => {
298298
expect(url.searchParams.getAll('multi')).toEqual(['value1', 'value2']);
299299
});
300300

301+
it('handles same parameter in both queryStringParameters and multiValueQueryStringParameters without duplication', () => {
302+
// Prepare
303+
const event = {
304+
...baseEvent,
305+
queryStringParameters: {
306+
filter: 'published', // Last value (API Gateway behavior)
307+
},
308+
multiValueQueryStringParameters: {
309+
filter: ['active', 'published'], // All values (API Gateway behavior)
310+
},
311+
};
312+
313+
// Act
314+
const request = proxyEventToWebRequest(event);
315+
316+
// Assess
317+
expect(request).toBeInstanceOf(Request);
318+
const url = new URL(request.url);
319+
expect(url.searchParams.getAll('filter')).toEqual([
320+
'active',
321+
'published',
322+
]);
323+
});
324+
325+
it('handles mixed single and multi-value query parameters correctly', () => {
326+
// Prepare
327+
const event = {
328+
...baseEvent,
329+
queryStringParameters: {
330+
single: 'value1', // Only in single-value
331+
multi: 'last', // Also in multi-value (should be ignored)
332+
},
333+
multiValueQueryStringParameters: {
334+
multi: ['first', 'last'], // Should take precedence
335+
},
336+
};
337+
338+
// Act
339+
const request = proxyEventToWebRequest(event);
340+
341+
// Assess
342+
expect(request).toBeInstanceOf(Request);
343+
const url = new URL(request.url);
344+
expect(url.searchParams.get('single')).toBe('value1');
345+
expect(url.searchParams.getAll('multi')).toEqual(['first', 'last']);
346+
});
347+
301348
it('skips undefined queryStringParameter values', () => {
302349
// Prepare
303350
const event = {

0 commit comments

Comments
 (0)