Skip to content

Commit 5645985

Browse files
committed
fix: enable response compression when using multi-value headers
1 parent f6dbb0b commit 5645985

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

aws_lambda_powertools/event_handler/api_gateway.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,8 +916,14 @@ def _has_compression_enabled(
916916
bool
917917
True if compression is enabled and the "gzip" encoding is accepted, False otherwise.
918918
"""
919-
encoding = event.headers.get("accept-encoding", "")
920-
if "gzip" in encoding:
919+
encoding = event.resolved_headers_field.get("accept-encoding", "")
920+
gzip_accepted = False
921+
if isinstance(encoding, str):
922+
gzip_accepted = "gzip" in encoding
923+
elif isinstance(encoding, list):
924+
gzip_accepted = "gzip" in ",".join(encoding)
925+
926+
if gzip_accepted:
921927
if response_compression is not None:
922928
return response_compression # e.g., Response(compress=False/True))
923929
if route_compression:

tests/functional/event_handler/_pydantic/test_openapi_swagger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def test_openapi_swagger():
2626
def test_openapi_swagger_compressed():
2727
app = APIGatewayRestResolver(enable_validation=True)
2828
app.enable_swagger(compress=True)
29-
LOAD_GW_EVENT["headers"] = {"Accept-Encoding": "gzip, deflate, br"}
29+
LOAD_GW_EVENT["multiValueHeaders"] = {"Accept-Encoding": ["gzip, deflate, br"]}
3030
LOAD_GW_EVENT["path"] = "/swagger"
3131
result = app(LOAD_GW_EVENT, {})
3232
assert result["statusCode"] == 200

tests/functional/event_handler/required_dependencies/test_api_gateway.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -464,12 +464,20 @@ def handler(event, context):
464464
assert result["multiValueHeaders"].get("Content-Encoding") is None
465465

466466

467-
def test_response_with_compress_enabled():
467+
@pytest.mark.parametrize(
468+
"headers",
469+
[
470+
{"headers": {"Accept-Encoding": "deflate, gzip"}},
471+
{"multiValueHeaders": {"Accept-Encoding": ["deflate, gzip"]}},
472+
{"multiValueHeaders": {"Accept-Encoding": ["deflate", "gzip"]}},
473+
],
474+
)
475+
def test_response_with_compress_enabled(headers: dict):
468476
# GIVEN a function
469477
# AND an event with a "Accept-Encoding" that include gzip
470478
# AND the Response object with compress=True
471479
app = ApiGatewayResolver()
472-
mock_event = {"path": "/my/request", "httpMethod": "GET", "headers": {"Accept-Encoding": "deflate, gzip"}}
480+
mock_event = {"path": "/my/request", "httpMethod": "GET", **headers}
473481
expected_value = '{"test": "value"}'
474482

475483
@app.get("/my/request")

0 commit comments

Comments
 (0)