Skip to content

Commit 9cd21aa

Browse files
feat(event-source): add function to get multi-value query string params by name (#3846)
Co-authored-by: Heitor Lessa <[email protected]> Co-authored-by: heitorlessa <[email protected]>
1 parent 5b1ead9 commit 9cd21aa

File tree

6 files changed

+87
-6
lines changed

6 files changed

+87
-6
lines changed

aws_lambda_powertools/utilities/data_classes/alb_event.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ def request_context(self) -> ALBEventRequestContext:
3232
return ALBEventRequestContext(self._data)
3333

3434
@property
35-
def multi_value_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
36-
return self.get("multiValueQueryStringParameters")
35+
def multi_value_query_string_parameters(self) -> Dict[str, List[str]]:
36+
return self.get("multiValueQueryStringParameters") or {}
3737

3838
@property
3939
def resolved_query_string_parameters(self) -> Dict[str, List[str]]:

aws_lambda_powertools/utilities/data_classes/common.py

+30
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from aws_lambda_powertools.shared.headers_serializer import BaseHeadersSerializer
88
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
99
get_header_value,
10+
get_multi_value_query_string_values,
1011
get_query_string_value,
1112
)
1213

@@ -103,6 +104,10 @@ def headers(self) -> Dict[str, str]:
103104
def query_string_parameters(self) -> Optional[Dict[str, str]]:
104105
return self.get("queryStringParameters")
105106

107+
@property
108+
def multi_value_query_string_parameters(self) -> Dict[str, List[str]]:
109+
return self.get("multiValueQueryStringParameters") or {}
110+
106111
@property
107112
def resolved_query_string_parameters(self) -> Dict[str, List[str]]:
108113
"""
@@ -184,6 +189,31 @@ def get_query_string_value(self, name: str, default_value: Optional[str] = None)
184189
default_value=default_value,
185190
)
186191

192+
def get_multi_value_query_string_values(
193+
self,
194+
name: str,
195+
default_values: Optional[List[str]] = None,
196+
) ->List[str]:
197+
"""Get multi-value query string parameter values by name
198+
199+
Parameters
200+
----------
201+
name: str
202+
Multi-Value query string parameter name
203+
default_values: List[str], optional
204+
Default values is no values are found by name
205+
Returns
206+
-------
207+
List[str], optional
208+
List of query string values
209+
210+
"""
211+
return get_multi_value_query_string_values(
212+
multi_value_query_string_parameters=self.multi_value_query_string_parameters,
213+
name=name,
214+
default_values=default_values,
215+
)
216+
187217
@overload
188218
def get_header_value(
189219
self,

aws_lambda_powertools/utilities/data_classes/shared_functions.py

+29-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import base64
4-
from typing import Any
4+
from typing import Any, Dict
55

66

77
def base64_decode(value: str) -> str:
@@ -63,7 +63,7 @@ def get_header_value(
6363

6464

6565
def get_query_string_value(
66-
query_string_parameters: dict[str, str] | None,
66+
query_string_parameters: Dict[str, str] | None,
6767
name: str,
6868
default_value: str | None = None,
6969
) -> str | None:
@@ -84,3 +84,30 @@ def get_query_string_value(
8484
"""
8585
params = query_string_parameters
8686
return default_value if params is None else params.get(name, default_value)
87+
88+
89+
def get_multi_value_query_string_values(
90+
multi_value_query_string_parameters: Dict[str, list[str]] | None,
91+
name: str,
92+
default_values: list[str] | None = None,
93+
) -> list[str]:
94+
"""
95+
Retrieves the values of a multi-value string parameters specified by the given name.
96+
97+
Parameters
98+
----------
99+
name: str
100+
The name of the query string parameter to retrieve.
101+
default_value: list[str], optional
102+
The default value to return if the parameter is not found. Defaults to None.
103+
104+
Returns
105+
-------
106+
List[str]. optional
107+
The values of the query string parameter if found, or the default values if not found.
108+
"""
109+
110+
default = default_values or []
111+
params = multi_value_query_string_parameters or {}
112+
113+
return params.get(name) or default

examples/event_handler_rest/src/accessing_request_details.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional
1+
from typing import List, Optional
22

33
import requests
44
from requests import Response
@@ -20,6 +20,9 @@ def get_todos():
2020
# alternatively
2121
_: Optional[str] = app.current_event.query_string_parameters.get("id")
2222

23+
# or multi-value query string parameters; ?category="red"&?category="blue"
24+
_: List[str] = app.current_event.get_multi_value_query_string_values(name="category")
25+
2326
# Payload
2427
_: Optional[str] = app.current_event.body # raw str | None
2528

tests/unit/data_classes/test_alb_event.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ def test_alb_event():
1111
assert parsed_event.path == raw_event["path"]
1212
assert parsed_event.query_string_parameters == raw_event["queryStringParameters"]
1313
assert parsed_event.headers == raw_event["headers"]
14-
assert parsed_event.multi_value_query_string_parameters == raw_event.get("multiValueQueryStringParameters")
14+
15+
assert parsed_event.multi_value_query_string_parameters == raw_event.get("multiValueQueryStringParameters", {})
16+
1517
assert parsed_event.multi_value_headers == raw_event.get("multiValueHeaders")
1618
assert parsed_event.body == raw_event["body"]
1719
assert parsed_event.is_base64_encoded == raw_event["isBase64Encoded"]

tests/unit/test_data_classes.py

+19
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,25 @@ def test_base_proxy_event_get_query_string_value():
259259
assert value is None
260260

261261

262+
def test_base_proxy_event_get_multi_value_query_string_values():
263+
default_values = ["default_1", "default_2"]
264+
set_values = ["value_1", "value_2"]
265+
266+
event = BaseProxyEvent({})
267+
values = event.get_multi_value_query_string_values("test", default_values)
268+
assert values == default_values
269+
270+
event._data["multiValueQueryStringParameters"] = {"test": set_values}
271+
values = event.get_multi_value_query_string_values("test", default_values)
272+
assert values == set_values
273+
274+
values = event.get_multi_value_query_string_values("unknown", default_values)
275+
assert values == default_values
276+
277+
values = event.get_multi_value_query_string_values("unknown")
278+
assert values == []
279+
280+
262281
def test_base_proxy_event_get_header_value():
263282
default_value = "default"
264283
set_value = "value"

0 commit comments

Comments
 (0)