diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py index 1380f41bb..c2ff5790e 100644 --- a/google/cloud/storage/blob.py +++ b/google/cloud/storage/blob.py @@ -804,7 +804,7 @@ def _extract_headers_from_download(self, response): digests = {} for encoded_digest in x_goog_hash.split(","): - match = re.match(r"(crc32c|md5)=([\w\d]+)==", encoded_digest) + match = re.match(r"(crc32c|md5)=([\w\d/]+={0,3})", encoded_digest) if match: method, digest = match.groups() digests[method] = digest diff --git a/tests/system/test_system.py b/tests/system/test_system.py index 3fb701d39..d14187baa 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -910,6 +910,18 @@ def test_upload_blob_owner(self): owner = same_blob.owner self.assertIn(user_email, owner["entity"]) + def test_blob_crc32_md5_hash(self): + blob = self.bucket.blob("MyBuffer") + file_contents = b"Hello World" + blob.upload_from_string(file_contents) + self.case_blobs_to_delete.append(blob) + + download_blob = self.bucket.blob("MyBuffer") + + self.assertEqual(download_blob.download_as_string(), file_contents) + self.assertEqual(download_blob.crc32c, blob.crc32c) + self.assertEqual(download_blob.md5_hash, blob.md5_hash) + class TestUnicode(unittest.TestCase): @vpcsc_config.skip_if_inside_vpcsc diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py index 68011e438..20e20abe4 100644 --- a/tests/unit/test_blob.py +++ b/tests/unit/test_blob.py @@ -1476,8 +1476,8 @@ def test_download_as_string_w_response_headers(self): self.assertEqual(blob.content_encoding, "gzip") self.assertEqual(blob.cache_control, "max-age=1337;public") self.assertEqual(blob.storage_class, "STANDARD") - self.assertEqual(blob.md5_hash, "CS9tHYTtyFntzj7B9nkkJQ") - self.assertEqual(blob.crc32c, "4gcgLQ") + self.assertEqual(blob.md5_hash, "CS9tHYTtyFntzj7B9nkkJQ==") + self.assertEqual(blob.crc32c, "4gcgLQ==") def test_download_as_string_w_hash_response_header_none(self): blob_name = "blob-name"