diff --git a/moto/s3/responses.py b/moto/s3/responses.py index a88c39851e20..310774c46727 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -1501,14 +1501,20 @@ def _key_response_get(self, query: Dict[str, Any], key_name: str) -> TYPE_RESPON def get_object(self) -> TYPE_RESPONSE: key, not_modified = self._get_key() response_headers = self._get_cors_headers_other() - if not_modified: - return 304, response_headers, "Not Modified" if key.version_id != "null": response_headers["x-amz-version-id"] = key.version_id - response_headers.update(key.metadata) response_headers.update(key.response_dict) + + if not_modified: + # Real S3 omits any content-* headers for a 304 + for header in list(response_headers.keys()): + if header.startswith("content-"): + response_headers.pop(header) + return 304, response_headers, "Not Modified" + + response_headers.update(key.metadata) response_headers.update({"Accept-Ranges": "bytes"}) part_number = self._get_int_param("partNumber") diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index a8424c6a7a10..94de871e3410 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -2103,6 +2103,7 @@ def test_get_object_if_none_match(): s3_client.get_object(Bucket=bucket_name, Key=key, IfNoneMatch=etag) err_value = err.value assert err_value.response["Error"] == {"Code": "304", "Message": "Not Modified"} + assert err_value.response["ResponseMetadata"]["HTTPHeaders"]["etag"] == etag @mock_aws @@ -2203,6 +2204,7 @@ def test_head_object_if_none_match(): s3_client.head_object(Bucket=bucket_name, Key=key, IfNoneMatch=etag) err_value = err.value assert err_value.response["Error"] == {"Code": "304", "Message": "Not Modified"} + assert err_value.response["ResponseMetadata"]["HTTPHeaders"]["etag"] == etag @mock_aws