Skip to content

Commit 77c1e40

Browse files
Michael Brewerheitorlessa
Michael Brewer
andauthored
feat(data-classes): decode base64 encoded body (#425)
Co-authored-by: Heitor Lessa <[email protected]>
1 parent 22754d3 commit 77c1e40

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

Diff for: aws_lambda_powertools/utilities/data_classes/common.py

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import base64
12
import json
23
from typing import Any, Dict, Optional
34

@@ -66,6 +67,14 @@ def json_body(self) -> Any:
6667
"""Parses the submitted body as json"""
6768
return json.loads(self["body"])
6869

70+
@property
71+
def decoded_body(self) -> str:
72+
"""Dynamically base64 decode body as a str"""
73+
body: str = self["body"]
74+
if self.is_base64_encoded:
75+
return base64.b64decode(body.encode()).decode()
76+
return body
77+
6978
@property
7079
def path(self) -> str:
7180
return self["path"]

Diff for: tests/functional/test_data_classes.py

+34
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from secrets import compare_digest
66
from urllib.parse import quote_plus
77

8+
import pytest
89
from pytest_mock import MockerFixture
910

1011
from aws_lambda_powertools.utilities.data_classes import (
@@ -848,6 +849,39 @@ def test_base_proxy_event_get_header_value_case_insensitive():
848849
assert value is None
849850

850851

852+
def test_base_proxy_event_json_body_key_error():
853+
event = BaseProxyEvent({})
854+
with pytest.raises(KeyError) as ke:
855+
assert not event.json_body
856+
assert str(ke.value) == "'body'"
857+
858+
859+
def test_base_proxy_event_json_body():
860+
data = {"message": "Foo"}
861+
event = BaseProxyEvent({"body": json.dumps(data)})
862+
assert event.json_body == data
863+
864+
865+
def test_base_proxy_event_decode_body_key_error():
866+
event = BaseProxyEvent({})
867+
with pytest.raises(KeyError) as ke:
868+
assert not event.decoded_body
869+
assert str(ke.value) == "'body'"
870+
871+
872+
def test_base_proxy_event_decode_body_encoded_false():
873+
data = "Foo"
874+
event = BaseProxyEvent({"body": data, "isBase64Encoded": False})
875+
assert event.decoded_body == data
876+
877+
878+
def test_base_proxy_event_decode_body_encoded_true():
879+
data = "Foo"
880+
encoded_data = base64.b64encode(data.encode()).decode()
881+
event = BaseProxyEvent({"body": encoded_data, "isBase64Encoded": True})
882+
assert event.decoded_body == data
883+
884+
851885
def test_kinesis_stream_event():
852886
event = KinesisStreamEvent(load_event("kinesisStreamEvent.json"))
853887

0 commit comments

Comments
 (0)