Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 86d8788

Browse files
authored
fix: don't raise when downloading zero byte files (googleapis#1074)
1 parent 857eaf3 commit 86d8788

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

googleapiclient/http.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -745,8 +745,16 @@ def next_chunk(self, num_retries=0):
745745
if self._total_size is None or self._progress == self._total_size:
746746
self._done = True
747747
return MediaDownloadProgress(self._progress, self._total_size), self._done
748-
else:
749-
raise HttpError(resp, content, uri=self._uri)
748+
elif resp.status == 416:
749+
# 416 is Range Not Satisfiable
750+
# This typically occurs with a zero byte file
751+
content_range = resp["content-range"]
752+
length = content_range.rsplit("/", 1)[1]
753+
self._total_size = int(length)
754+
if self._total_size == 0:
755+
self._done = True
756+
return MediaDownloadProgress(self._progress, self._total_size), self._done
757+
raise HttpError(resp, content, uri=self._uri)
750758

751759

752760
class _StreamSlice(object):

tests/test_http.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,26 @@ def test_media_io_base_download_empty_file(self):
672672
self.assertEqual(0, download._total_size)
673673
self.assertEqual(0, status.progress())
674674

675+
def test_media_io_base_download_empty_file_416_response(self):
676+
self.request.http = HttpMockSequence(
677+
[({"status": "416", "content-range": "0-0/0"}, b"")]
678+
)
679+
680+
download = MediaIoBaseDownload(fd=self.fd, request=self.request, chunksize=3)
681+
682+
self.assertEqual(self.fd, download._fd)
683+
self.assertEqual(0, download._progress)
684+
self.assertEqual(None, download._total_size)
685+
self.assertEqual(False, download._done)
686+
self.assertEqual(self.request.uri, download._uri)
687+
688+
status, done = download.next_chunk()
689+
690+
self.assertEqual(True, done)
691+
self.assertEqual(0, download._progress)
692+
self.assertEqual(0, download._total_size)
693+
self.assertEqual(0, status.progress())
694+
675695
def test_media_io_base_download_unknown_media_size(self):
676696
self.request.http = HttpMockSequence([({"status": "200"}, b"123")])
677697

0 commit comments

Comments
 (0)