@@ -35,6 +35,42 @@ class AwsAlb(AbstractHandler):
3535
3636 TYPE = "AWS_ALB"
3737
38+ def encode_query_string (self ) -> bytes :
39+ """
40+ Encodes the queryStringParameters.
41+ The parameters must be decoded, and then encoded again to prevent double
42+ encoding.
43+
44+ https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html # noqa: E501
45+ "If the query parameters are URL-encoded, the load balancer does not decode
46+ them. You must decode them in your Lambda function."
47+
48+ Issue: https://github.com/jordaneremieff/mangum/issues/178
49+ """
50+
51+ params = self .trigger_event .get ("multiValueQueryStringParameters" )
52+ if not params :
53+ params = self .trigger_event .get ("queryStringParameters" )
54+ if not params :
55+ return b"" # No query parameters, exit early with an empty byte string.
56+
57+ # Loop through the query parameters, unquote each key and value and append the
58+ # pair as a tuple to the query list. If value is a list or a tuple, loop
59+ # through the nested struture and unqote.
60+ query = []
61+ for key , value in params .items ():
62+ if isinstance (value , (tuple , list )):
63+ for v in value :
64+ query .append (
65+ (urllib .parse .unquote_plus (key ), urllib .parse .unquote_plus (v ))
66+ )
67+ else :
68+ query .append (
69+ (urllib .parse .unquote_plus (key ), urllib .parse .unquote_plus (value ))
70+ )
71+
72+ return urllib .parse .urlencode (query ).encode ()
73+
3874 @property
3975 def request (self ) -> Request :
4076 event = self .trigger_event
@@ -46,9 +82,7 @@ def request(self) -> Request:
4682 source_ip = headers .get ("x-forwarded-for" , "" )
4783 path = event ["path" ]
4884 http_method = event ["httpMethod" ]
49- query_string = urllib .parse .urlencode (
50- event .get ("queryStringParameters" , {}), doseq = True
51- ).encode ()
85+ query_string = self .encode_query_string ()
5286
5387 server_name = headers .get ("host" , "mangum" )
5488 if ":" not in server_name :
0 commit comments