From 7affaf3e5229b349e1ed856a9690011a69c1da0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristopher=20Pinz=C3=B3n?= Date: Tue, 23 Aug 2022 14:48:19 -0500 Subject: [PATCH] S3: Checksum headers added to response (#5392) --- moto/s3/responses.py | 10 ++++++++++ tests/test_s3/test_s3.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 5a59f1097..e825faa56 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -1356,6 +1356,16 @@ class S3Response(BaseResponse): "x-amz-server-side-encryption-aws-kms-key-id", None ) + checksum_algorithm = request.headers.get("x-amz-sdk-checksum-algorithm", "") + checksum_header = f"x-amz-checksum-{checksum_algorithm.lower()}" + checksum_value = request.headers.get(checksum_header) + if not checksum_value and checksum_algorithm: + search = re.search(r"x-amz-checksum-\w+:(\w+={1,2})", body.decode()) + checksum_value = search.group(1) if search else None + + if checksum_value: + response_headers.update({checksum_header: checksum_value}) + bucket_key_enabled = request.headers.get( "x-amz-server-side-encryption-bucket-key-enabled", None ) diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 12b8dc66c..625f127a4 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -3395,3 +3395,21 @@ def test_prefix_encoding(): map(lambda common_prefix: common_prefix["Prefix"], data["CommonPrefixes"]) ) assert ["foo%2Fbar/", "foo/"] == folders + + +@mock_s3 +@pytest.mark.parametrize("algorithm", ["CRC32", "CRC32C", "SHA1", "SHA256"]) +def test_checksum_response(algorithm): + bucket_name = "checksum-bucket" + client = boto3.client("s3", region_name=DEFAULT_REGION_NAME) + client.create_bucket(Bucket=bucket_name) + if ( + algorithm != "CRC32C" + ): # awscrt is required to allow botocore checksum with CRC32C + response = client.put_object( + Bucket=bucket_name, + Key="test-key", + Body=b"data", + ChecksumAlgorithm=algorithm, + ) + assert f"Checksum{algorithm}" in response