Skip to content

Commit c2f5634

Browse files
Fixed decompression implementation for blob client-side encryption
1 parent 0c7824f commit c2f5634

File tree

4 files changed

+16
-6
lines changed

4 files changed

+16
-6
lines changed

sdk/storage/azure-storage-blob/azure/storage/blob/_download.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,8 @@ def _get_encryption_data_request(self) -> None:
423423
# Save current request cls
424424
download_cls = self._request_options.pop('cls', None)
425425

426-
# Decompression does not work with client-side encryption
427-
self._request_options.pop('decompress', None)
426+
# Temporarily removing this for the get properties request
427+
decompress = self._request_options.pop('decompress', None)
428428

429429
# Adjust cls for get_properties
430430
self._request_options['cls'] = deserialize_blob_properties
@@ -438,6 +438,10 @@ def _get_encryption_data_request(self) -> None:
438438
# Restore cls for download
439439
self._request_options['cls'] = download_cls
440440

441+
# Decompression does not work with client-side encryption
442+
if decompress is not None:
443+
self._request_options['decompress'] = False
444+
441445
@property
442446
def _download_complete(self):
443447
if is_encryption_v2(self._encryption_data):

sdk/storage/azure-storage-blob/azure/storage/blob/aio/_download_async.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,8 @@ async def _get_encryption_data_request(self) -> None:
293293
# Save current request cls
294294
download_cls = self._request_options.pop('cls', None)
295295

296-
# Decompression does not work with client-side encryption
297-
self._request_options.pop('decompress', None)
296+
# Temporarily removing this for the get properties request
297+
decompress = self._request_options.pop('decompress', None)
298298

299299
# Adjust cls for get_properties
300300
self._request_options['cls'] = deserialize_blob_properties
@@ -308,6 +308,10 @@ async def _get_encryption_data_request(self) -> None:
308308
# Restore cls for download
309309
self._request_options['cls'] = download_cls
310310

311+
# Decompression does not work with client-side encryption
312+
if decompress is not None:
313+
self._request_options['decompress'] = False
314+
311315
async def _setup(self) -> None:
312316
if self._encryption_options.get("key") is not None or self._encryption_options.get("resolver") is not None:
313317
await self._get_encryption_data_request()

sdk/storage/azure-storage-blob/tests/test_blob_encryption_v2.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,11 @@ def test_decompression_with_encryption(self, **kwargs):
208208

209209
blob = self.bsc.get_blob_client(self.container_name, self._get_blob_reference())
210210
compressed_data = b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcaH\xcd\xc9\xc9WH+\xca\xcfUH\xaf\xca,\x00\x00\x00\x00\xff\xff\x03\x00d\xaa\x8e\xb5\x0f\x00\x00\x00'
211+
content_settings = ContentSettings(content_encoding='gzip')
211212

212213
# Act / Assert
213214
# Cannot directly set content settings on encrypted blobs
214-
blob.upload_blob(data=compressed_data, overwrite=True)
215+
blob.upload_blob(data=compressed_data, overwrite=True, content_settings=content_settings)
215216

216217
result = blob.download_blob(decompress=False).readall()
217218
assert result == compressed_data

sdk/storage/azure-storage-blob/tests/test_blob_encryption_v2_async.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,11 @@ async def test_decompression_with_encryption(self, **kwargs):
211211

212212
blob = self.bsc.get_blob_client(self.container_name, self._get_blob_reference())
213213
compressed_data = b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcaH\xcd\xc9\xc9WH+\xca\xcfUH\xaf\xca,\x00\x00\x00\x00\xff\xff\x03\x00d\xaa\x8e\xb5\x0f\x00\x00\x00'
214+
content_settings = ContentSettings(content_encoding='gzip')
214215

215216
# Act / Assert
216217
# Cannot directly set content settings on encrypted blobs
217-
await blob.upload_blob(data=compressed_data, overwrite=True)
218+
await blob.upload_blob(data=compressed_data, overwrite=True, content_setting=content_settings)
218219

219220
result = await (await blob.download_blob(decompress=False)).readall()
220221
assert result == compressed_data

0 commit comments

Comments
 (0)