Skip to content

Commit 698687c

Browse files
fix(aws_lambda): handle null headers, query string, and body in API Gateway events (#1587)
Co-authored-by: Ale Mercado <104795114+srtaalej@users.noreply.github.com>
1 parent 3774392 commit 698687c

2 files changed

Lines changed: 59 additions & 9 deletions

File tree

‎slack_bolt/adapter/aws_lambda/handler.py‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,22 @@ def handle(self, event, context):
7171

7272

7373
def to_bolt_request(event) -> BoltRequest:
74-
body = event.get("body", "")
75-
if event["isBase64Encoded"]:
74+
body = event.get("body") or ""
75+
if event.get("isBase64Encoded") is True and body:
7676
body = base64.b64decode(body).decode("utf-8")
77-
cookies: Sequence[str] = event.get("cookies", [])
78-
if cookies is None or len(cookies) == 0:
77+
cookies: Sequence[str] = event.get("cookies") or []
78+
if len(cookies) == 0:
7979
# In the case of format v1
80-
multiValueHeaders = event.get("multiValueHeaders", {})
81-
cookies = multiValueHeaders.get("cookie", [])
80+
multiValueHeaders = event.get("multiValueHeaders") or {}
81+
cookies = multiValueHeaders.get("cookie") or []
8282
if len(cookies) == 0:
8383
# Try using uppercase
84-
cookies = multiValueHeaders.get("Cookie", [])
85-
headers = event.get("headers", {})
84+
cookies = multiValueHeaders.get("Cookie") or []
85+
headers = dict(event.get("headers") or {})
8686
headers["cookie"] = cookies
8787
return BoltRequest(
8888
body=body,
89-
query=event.get("queryStringParameters", {}),
89+
query=event.get("queryStringParameters") or {},
9090
headers=headers,
9191
)
9292

‎tests/adapter_tests/aws/test_aws_lambda.py‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import base64
12
import json
23
from time import time
34
from urllib.parse import quote
@@ -70,6 +71,55 @@ def test_not_found(self):
7071
response = not_found()
7172
assert response["statusCode"] == 404
7273

74+
def test_null_fields_in_api_gateway_event(self):
75+
app = App(client=self.web_client, signing_secret=self.signing_secret)
76+
event = {
77+
"httpMethod": "POST",
78+
"requestContext": {"httpMethod": "POST"},
79+
"headers": None,
80+
"multiValueHeaders": None,
81+
"queryStringParameters": None,
82+
"body": "{}",
83+
"isBase64Encoded": False,
84+
}
85+
response = SlackRequestHandler(app).handle(event, self.context)
86+
assert response["statusCode"] == 401
87+
assert event["headers"] is None
88+
89+
def test_missing_is_base64_encoded_and_null_body(self):
90+
app = App(client=self.web_client, signing_secret=self.signing_secret)
91+
event = {"requestContext": {"http": {"method": "POST"}}, "headers": {}, "body": "{}"}
92+
assert SlackRequestHandler(app).handle(event, self.context)["statusCode"] == 401
93+
event = {"requestContext": {"http": {"method": "POST"}}, "headers": {}, "body": None, "isBase64Encoded": True}
94+
assert SlackRequestHandler(app).handle(event, self.context)["statusCode"] == 401
95+
96+
def test_base64_encoded_body(self):
97+
app = App(client=self.web_client, signing_secret=self.signing_secret)
98+
99+
def event_handler():
100+
pass
101+
102+
app.event("app_mention")(event_handler)
103+
input = {
104+
"token": "verification_token",
105+
"team_id": "T111",
106+
"api_app_id": "A111",
107+
"event": {"type": "app_mention", "text": "<@W111> Hi", "user": "W222", "team": "T111", "channel": "C111"},
108+
"type": "event_callback",
109+
"event_id": "Ev111",
110+
"event_time": 1595926230,
111+
}
112+
timestamp, body = str(int(time())), json.dumps(input)
113+
event = {
114+
"body": base64.b64encode(body.encode("utf-8")).decode("ascii"),
115+
"queryStringParameters": None,
116+
"headers": self.build_headers(timestamp, body),
117+
"requestContext": {"http": {"method": "POST"}},
118+
"isBase64Encoded": True,
119+
}
120+
response = SlackRequestHandler(app).handle(event, self.context)
121+
assert response["statusCode"] == 200
122+
73123
def test_first_value(self):
74124
assert _first_value({"foo": [1, 2, 3]}, "foo") == 1
75125
assert _first_value({"foo": []}, "foo") is None

0 commit comments

Comments
 (0)