From 981959a1346d6a77e2c38cd81257dbdb87556468 Mon Sep 17 00:00:00 2001 From: Thomas Buatois Date: Wed, 20 Jul 2022 11:12:04 +0200 Subject: [PATCH 1/2] fix(event_handler): NoneType error for compress feature without headers --- .../utilities/data_classes/common.py | 4 ++++ .../event_handler/test_api_gateway.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/aws_lambda_powertools/utilities/data_classes/common.py b/aws_lambda_powertools/utilities/data_classes/common.py index 45f6bafc957..5cfa8fd0de2 100644 --- a/aws_lambda_powertools/utilities/data_classes/common.py +++ b/aws_lambda_powertools/utilities/data_classes/common.py @@ -35,6 +35,10 @@ def get_header_value( if case_sensitive: return headers.get(name, default_value) + # If headers is NoneType, return default value + if not headers: + return default_value + name_lower = name.lower() return next( diff --git a/tests/functional/event_handler/test_api_gateway.py b/tests/functional/event_handler/test_api_gateway.py index 0c6d1954836..f1fb6a1f942 100644 --- a/tests/functional/event_handler/test_api_gateway.py +++ b/tests/functional/event_handler/test_api_gateway.py @@ -314,6 +314,24 @@ def return_text() -> Response: assert result["body"] == expected_value +def test_compress_no_accept_encoding_null_headers(): + # GIVEN a function with compress=True + # AND the request has no headers + app = ApiGatewayResolver() + expected_value = "Foo" + + @app.get("/my/path", compress=True) + def return_text() -> Response: + return Response(200, content_types.TEXT_PLAIN, expected_value) + + # WHEN calling the event handler + result = app({"path": "/my/path", "httpMethod": "GET", "headers": None}, None) + + # THEN don't perform any gzip compression + assert result["isBase64Encoded"] is False + assert result["body"] == expected_value + + def test_cache_control_200(): # GIVEN a function with cache_control set app = ApiGatewayResolver() From 281722da7d99d1552ac8b1cb83dfe48d798e47d2 Mon Sep 17 00:00:00 2001 From: tbuatois <93767890+tbuatois@users.noreply.github.com> Date: Wed, 20 Jul 2022 13:42:47 +0200 Subject: [PATCH 2/2] check order changes Changing the order to prevent case_sensitive=True logic to kick in and fail on AttributeError, since None wouldn't have .get Co-authored-by: Heitor Lessa --- aws_lambda_powertools/utilities/data_classes/common.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/utilities/data_classes/common.py b/aws_lambda_powertools/utilities/data_classes/common.py index 5cfa8fd0de2..c651c225fab 100644 --- a/aws_lambda_powertools/utilities/data_classes/common.py +++ b/aws_lambda_powertools/utilities/data_classes/common.py @@ -32,13 +32,12 @@ def get_header_value( headers: Dict[str, str], name: str, default_value: Optional[str], case_sensitive: Optional[bool] ) -> Optional[str]: """Get header value by name""" - if case_sensitive: - return headers.get(name, default_value) - # If headers is NoneType, return default value if not headers: return default_value + if case_sensitive: + return headers.get(name, default_value) name_lower = name.lower() return next(