Make http.MediaFileUpload close its file descriptor. (#600)
Closes #575.
diff --git a/googleapiclient/http.py b/googleapiclient/http.py
index 5caca19..e795274 100644
--- a/googleapiclient/http.py
+++ b/googleapiclient/http.py
@@ -558,9 +558,13 @@
if mimetype is None:
# Guess failed, use octet-stream.
mimetype = 'application/octet-stream'
- super(MediaFileUpload, self).__init__(fd, mimetype, chunksize=chunksize,
+ super(MediaFileUpload, self).__init__(fd, mimetype,
+ chunksize=chunksize,
resumable=resumable)
+ def __del__(self):
+ self._fd.close()
+
def to_json(self):
"""Creating a JSON representation of an instance of MediaFileUpload.
diff --git a/tests/test_http.py b/tests/test_http.py
index 6c2748b..edaef6d 100644
--- a/tests/test_http.py
+++ b/tests/test_http.py
@@ -31,6 +31,7 @@
# Do not remove the httplib2 import
import json
import httplib2
+import io
import logging
import mock
import os
@@ -209,6 +210,15 @@
class TestMediaUpload(unittest.TestCase):
+ def test_media_file_upload_closes_fd_in___del__(self):
+ file_desc = mock.Mock(spec=io.TextIOWrapper)
+ opener = mock.mock_open(file_desc)
+ with mock.patch('__builtin__.open', return_value=opener):
+ upload = MediaFileUpload(datafile('test_close'), mimetype='text/plain')
+ self.assertIs(upload.stream(), file_desc)
+ del upload
+ file_desc.close.assert_called_once_with()
+
def test_media_file_upload_mimetype_detection(self):
upload = MediaFileUpload(datafile('small.png'))
self.assertEqual('image/png', upload.mimetype())
@@ -861,7 +871,7 @@
headers={'content-type': ''})
request.execute()
self.assertEqual('', http.headers.get('content-type'))
-
+
def test_no_retry_connection_errors(self):
model = JsonModel()
request = HttpRequest(