Skip to content

Commit a6f9e44

Browse files
committed
fix(event-handler): handle single parameters correctly
1 parent 770f023 commit a6f9e44

File tree

7 files changed

+209
-134
lines changed

7 files changed

+209
-134
lines changed

aws_lambda_powertools/event_handler/middlewares/openapi_validation.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,10 @@ def _get_embed_body(
368368
return received_body, field_alias_omitted
369369

370370

371-
def _normalize_multi_query_string_with_param(query_string: Optional[Dict[str, str]], params: Sequence[ModelField]):
371+
def _normalize_multi_query_string_with_param(
372+
query_string: Optional[Dict[str, List[str]]],
373+
params: Sequence[ModelField],
374+
):
372375
"""
373376
Extract and normalize resolved_query_string_parameters
374377
@@ -383,15 +386,18 @@ def _normalize_multi_query_string_with_param(query_string: Optional[Dict[str, st
383386
-------
384387
A dictionary containing the processed multi_query_string_parameters.
385388
"""
386-
if query_string:
389+
if not query_string:
390+
return None
391+
else:
392+
resolved_query_string: Dict[str, Any] = query_string
387393
for param in filter(is_scalar_field, params):
388394
try:
389395
# if the target parameter is a scalar, we keep the first value of the query string
390396
# regardless if there are more in the payload
391-
query_string[param.alias] = query_string[param.alias][0]
397+
resolved_query_string[param.alias] = query_string[param.alias][0]
392398
except KeyError:
393399
pass
394-
return query_string
400+
return resolved_query_string
395401

396402

397403
def _normalize_multi_header_values_with_param(headers: Optional[Dict[str, str]], params: Sequence[ModelField]):

aws_lambda_powertools/utilities/data_classes/alb_event.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@ def multi_value_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
3636
return self.get("multiValueQueryStringParameters")
3737

3838
@property
39-
def resolved_query_string_parameters(self) -> Optional[Dict[str, Any]]:
39+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
4040
if self.multi_value_query_string_parameters:
4141
return self.multi_value_query_string_parameters
4242

43-
return self.query_string_parameters
43+
if self.query_string_parameters:
44+
query_string = {key: value.split(",") for key, value in self.query_string_parameters.items()}
45+
return query_string
46+
47+
return None
4448

4549
@property
4650
def resolved_headers_field(self) -> Optional[Dict[str, Any]]:

aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,15 @@ def multi_value_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
119119
return self.get("multiValueQueryStringParameters")
120120

121121
@property
122-
def resolved_query_string_parameters(self) -> Optional[Dict[str, Any]]:
122+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
123123
if self.multi_value_query_string_parameters:
124124
return self.multi_value_query_string_parameters
125125

126-
return self.query_string_parameters
126+
if self.query_string_parameters:
127+
query_string = {key: value.split(",") for key, value in self.query_string_parameters.items()}
128+
return query_string
129+
130+
return None
127131

128132
@property
129133
def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
@@ -319,14 +323,12 @@ def header_serializer(self):
319323
return HttpApiHeadersSerializer()
320324

321325
@property
322-
def resolved_query_string_parameters(self) -> Optional[Dict[str, Any]]:
326+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
323327
if self.query_string_parameters is not None:
324-
query_string = {
325-
key: value.split(",") if "," in value else value for key, value in self.query_string_parameters.items()
326-
}
328+
query_string = {key: value.split(",") for key, value in self.query_string_parameters.items()}
327329
return query_string
328330

329-
return {}
331+
return None
330332

331333
@property
332334
def resolved_headers_field(self) -> Optional[Dict[str, Any]]:

aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,12 @@ def query_string_parameters(self) -> Optional[Dict[str, str]]:
110110
return {x["name"]: x["value"] for x in self["parameters"]} if self.get("parameters") else None
111111

112112
@property
113-
def resolved_query_string_parameters(self) -> Optional[Dict[str, str]]:
114-
return self.query_string_parameters
113+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
114+
if self.query_string_parameters is not None:
115+
query_string = {key: value.split(",") for key, value in self.query_string_parameters.items()}
116+
return query_string
117+
118+
return None
115119

116120
@property
117121
def resolved_headers_field(self) -> Optional[Dict[str, Any]]:

aws_lambda_powertools/utilities/data_classes/common.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,19 @@ def query_string_parameters(self) -> Optional[Dict[str, str]]:
104104
return self.get("queryStringParameters")
105105

106106
@property
107-
def resolved_query_string_parameters(self) -> Optional[Dict[str, str]]:
107+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
108108
"""
109109
This property determines the appropriate query string parameter to be used
110110
as a trusted source for validating OpenAPI.
111111
112112
This is necessary because different resolvers use different formats to encode
113113
multi query string parameters.
114114
"""
115-
return self.query_string_parameters
115+
if self.query_string_parameters is not None:
116+
query_string = {key: value.split(",") for key, value in self.query_string_parameters.items()}
117+
return query_string
118+
119+
return None
116120

117121
@property
118122
def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
@@ -186,17 +190,15 @@ def get_header_value(
186190
name: str,
187191
default_value: str,
188192
case_sensitive: Optional[bool] = False,
189-
) -> str:
190-
...
193+
) -> str: ...
191194

192195
@overload
193196
def get_header_value(
194197
self,
195198
name: str,
196199
default_value: Optional[str] = None,
197200
case_sensitive: Optional[bool] = False,
198-
) -> Optional[str]:
199-
...
201+
) -> Optional[str]: ...
200202

201203
def get_header_value(
202204
self,

aws_lambda_powertools/utilities/data_classes/vpc_lattice.py

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from functools import cached_property
2-
from typing import Any, Dict, Optional, overload
2+
from typing import Any, Dict, List, Optional, overload
33

44
from aws_lambda_powertools.shared.headers_serializer import (
55
BaseHeadersSerializer,
@@ -73,17 +73,15 @@ def get_header_value(
7373
name: str,
7474
default_value: str,
7575
case_sensitive: Optional[bool] = False,
76-
) -> str:
77-
...
76+
) -> str: ...
7877

7978
@overload
8079
def get_header_value(
8180
self,
8281
name: str,
8382
default_value: Optional[str] = None,
8483
case_sensitive: Optional[bool] = False,
85-
) -> Optional[str]:
86-
...
84+
) -> Optional[str]: ...
8785

8886
def get_header_value(
8987
self,
@@ -141,8 +139,11 @@ def query_string_parameters(self) -> Dict[str, str]:
141139
return self["query_string_parameters"]
142140

143141
@property
144-
def resolved_query_string_parameters(self) -> Optional[Dict[str, str]]:
145-
return self.query_string_parameters
142+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
143+
if self.query_string_parameters is not None:
144+
query_string = {key: value.split(",") for key, value in self.query_string_parameters.items()}
145+
return query_string
146+
return None
146147

147148
@property
148149
def resolved_headers_field(self) -> Optional[Dict[str, Any]]:
@@ -264,8 +265,14 @@ def query_string_parameters(self) -> Optional[Dict[str, str]]:
264265
return self.get("queryStringParameters")
265266

266267
@property
267-
def resolved_query_string_parameters(self) -> Optional[Dict[str, str]]:
268-
return self.query_string_parameters
268+
def resolved_query_string_parameters(self) -> Optional[Dict[str, List[str]]]:
269+
if self.query_string_parameters is not None:
270+
query_string = {
271+
key: value.split(",") if not isinstance(value, list) else value
272+
for key, value in self.query_string_parameters.items()
273+
}
274+
return query_string
275+
return None
269276

270277
@property
271278
def resolved_headers_field(self) -> Optional[Dict[str, str]]:

0 commit comments

Comments
 (0)