fix: don't raise when downloading zero byte files (#1074)
diff --git a/googleapiclient/http.py b/googleapiclient/http.py
index a875751..0046774 100644
--- a/googleapiclient/http.py
+++ b/googleapiclient/http.py
@@ -745,8 +745,16 @@
if self._total_size is None or self._progress == self._total_size:
self._done = True
return MediaDownloadProgress(self._progress, self._total_size), self._done
- else:
- raise HttpError(resp, content, uri=self._uri)
+ elif resp.status == 416:
+ # 416 is Range Not Satisfiable
+ # This typically occurs with a zero byte file
+ content_range = resp["content-range"]
+ length = content_range.rsplit("/", 1)[1]
+ self._total_size = int(length)
+ if self._total_size == 0:
+ self._done = True
+ return MediaDownloadProgress(self._progress, self._total_size), self._done
+ raise HttpError(resp, content, uri=self._uri)
class _StreamSlice(object):
diff --git a/tests/test_http.py b/tests/test_http.py
index c7d9cc3..00db06e 100644
--- a/tests/test_http.py
+++ b/tests/test_http.py
@@ -672,6 +672,26 @@
self.assertEqual(0, download._total_size)
self.assertEqual(0, status.progress())
+ def test_media_io_base_download_empty_file_416_response(self):
+ self.request.http = HttpMockSequence(
+ [({"status": "416", "content-range": "0-0/0"}, b"")]
+ )
+
+ download = MediaIoBaseDownload(fd=self.fd, request=self.request, chunksize=3)
+
+ self.assertEqual(self.fd, download._fd)
+ self.assertEqual(0, download._progress)
+ self.assertEqual(None, download._total_size)
+ self.assertEqual(False, download._done)
+ self.assertEqual(self.request.uri, download._uri)
+
+ status, done = download.next_chunk()
+
+ self.assertEqual(True, done)
+ self.assertEqual(0, download._progress)
+ self.assertEqual(0, download._total_size)
+ self.assertEqual(0, status.progress())
+
def test_media_io_base_download_unknown_media_size(self):
self.request.http = HttpMockSequence([({"status": "200"}, b"123")])