Skip to content
Permalink
Browse files
fix(blob): base64 includes additional characters (#258)
Hashes were not being parsed correctly. I forgot that base64 includes the "+" and "/" characters. 

https://en.wikipedia.org/wiki/Base64

<img width="656" alt="image" src="https://user-images.githubusercontent.com/2517065/91491542-3329ee80-e882-11ea-9665-4eaa564b406b.png">
  • Loading branch information
william-silversmith committed Sep 2, 2020
1 parent e190f1c commit cf0774aa8ffd45d340aff9a7d2236d8d65c8ae93
Showing with 19 additions and 1 deletion.
  1. +1 −1 google/cloud/storage/blob.py
  2. +18 −0 tests/unit/test_blob.py
@@ -813,7 +813,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/]+={0,3})", encoded_digest)
match = re.match(r"(crc32c|md5)=([\w\d/\+/]+={0,3})", encoded_digest)
if match:
method, digest = match.groups()
digests[method] = digest
@@ -1522,6 +1522,24 @@ def test_download_as_string_w_response_headers(self):
self.assertEqual(blob.md5_hash, "CS9tHYTtyFntzj7B9nkkJQ==")
self.assertEqual(blob.crc32c, "4gcgLQ==")

response = self._mock_requests_response(
http_client.OK,
headers={
"Content-Type": "application/octet-stream",
"Content-Language": "en-US",
"Cache-Control": "max-age=1337;public",
"Content-Encoding": "gzip",
"X-Goog-Storage-Class": "STANDARD",
"X-Goog-Hash": "crc32c=4/c+LQ==,md5=CS9tHYTt/+ntzj7B9nkkJQ==",
},
content=b"",
)
blob._extract_headers_from_download(response)
self.assertEqual(blob.content_type, "application/octet-stream")
self.assertEqual(blob.content_language, "en-US")
self.assertEqual(blob.md5_hash, "CS9tHYTt/+ntzj7B9nkkJQ==")
self.assertEqual(blob.crc32c, "4/c+LQ==")

def test_download_as_string_w_hash_response_header_none(self):
blob_name = "blob-name"
client = mock.Mock(spec=["_http"])

0 comments on commit cf0774a

Please sign in to comment.