From 1437389e86c9e6c361b68200cfc51cf2a5be0553 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Thu, 6 May 2021 17:44:39 -0700 Subject: [PATCH 1/2] feat(data-classes): decode base64 encoded body --- .../utilities/data_classes/common.py | 9 +++++ tests/functional/test_data_classes.py | 35 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/aws_lambda_powertools/utilities/data_classes/common.py b/aws_lambda_powertools/utilities/data_classes/common.py index a6b975c6072..3869b3044f5 100644 --- a/aws_lambda_powertools/utilities/data_classes/common.py +++ b/aws_lambda_powertools/utilities/data_classes/common.py @@ -1,3 +1,4 @@ +import base64 import json from typing import Any, Dict, Optional @@ -66,6 +67,14 @@ def json_body(self) -> Any: """Parses the submitted body as json""" return json.loads(self["body"]) + @property + def decode_body(self) -> str: + """Dynamically base64 decode body as a str""" + body: str = self["body"] + if self.is_base64_encoded: + return base64.b64decode(body.encode()).decode() + return body + @property def path(self) -> str: return self["path"] diff --git a/tests/functional/test_data_classes.py b/tests/functional/test_data_classes.py index d346eca480a..dfe1c20027e 100644 --- a/tests/functional/test_data_classes.py +++ b/tests/functional/test_data_classes.py @@ -4,6 +4,8 @@ from secrets import compare_digest from urllib.parse import quote_plus +import pytest + from aws_lambda_powertools.utilities.data_classes import ( ALBEvent, APIGatewayProxyEvent, @@ -843,6 +845,39 @@ def test_base_proxy_event_get_header_value_case_insensitive(): assert value is None +def test_base_proxy_event_json_body_key_error(): + event = BaseProxyEvent({}) + with pytest.raises(KeyError) as ke: + assert not event.json_body + assert str(ke.value) == "'body'" + + +def test_base_proxy_event_json_body(): + data = {"message": "Foo"} + event = BaseProxyEvent({"body": json.dumps(data)}) + assert event.json_body == data + + +def test_base_proxy_event_decode_body_key_error(): + event = BaseProxyEvent({}) + with pytest.raises(KeyError) as ke: + assert not event.decode_body + assert str(ke.value) == "'body'" + + +def test_base_proxy_event_decode_body_encoded_false(): + data = "Foo" + event = BaseProxyEvent({"body": data, "isBase64Encoded": False}) + assert event.decode_body == data + + +def test_base_proxy_event_decode_body_encoded_true(): + data = "Foo" + encoded_data = base64.b64encode(data.encode()).decode() + event = BaseProxyEvent({"body": encoded_data, "isBase64Encoded": True}) + assert event.decode_body == data + + def test_kinesis_stream_event(): event = KinesisStreamEvent(load_event("kinesisStreamEvent.json")) From e786891f0fc27bd823f8dcb3b608b6149bd36e3b Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 17 May 2021 06:09:10 -0700 Subject: [PATCH 2/2] refactor: rename to decoded Co-authored-by: Heitor Lessa --- aws_lambda_powertools/utilities/data_classes/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/data_classes/common.py b/aws_lambda_powertools/utilities/data_classes/common.py index 3869b3044f5..66c8f15324f 100644 --- a/aws_lambda_powertools/utilities/data_classes/common.py +++ b/aws_lambda_powertools/utilities/data_classes/common.py @@ -68,7 +68,7 @@ def json_body(self) -> Any: return json.loads(self["body"]) @property - def decode_body(self) -> str: + def decoded_body(self) -> str: """Dynamically base64 decode body as a str""" body: str = self["body"] if self.is_base64_encoded: