Skip to content

Commit 20b6758

Browse files
wangxf123456tseaver
authored andcommitted
Make http.MediaFileUpload close its file descriptor. (#600)
Closes #575.
1 parent b854ff1 commit 20b6758

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

googleapiclient/http.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,9 +558,13 @@ def __init__(self, filename, mimetype=None, chunksize=DEFAULT_CHUNK_SIZE,
558558
if mimetype is None:
559559
# Guess failed, use octet-stream.
560560
mimetype = 'application/octet-stream'
561-
super(MediaFileUpload, self).__init__(fd, mimetype, chunksize=chunksize,
561+
super(MediaFileUpload, self).__init__(fd, mimetype,
562+
chunksize=chunksize,
562563
resumable=resumable)
563564

565+
def __del__(self):
566+
self._fd.close()
567+
564568
def to_json(self):
565569
"""Creating a JSON representation of an instance of MediaFileUpload.
566570

tests/test_http.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
# Do not remove the httplib2 import
3232
import json
3333
import httplib2
34+
import io
3435
import logging
3536
import mock
3637
import os
@@ -209,6 +210,15 @@ def test_set_user_agent_nested(self):
209210

210211
class TestMediaUpload(unittest.TestCase):
211212

213+
def test_media_file_upload_closes_fd_in___del__(self):
214+
file_desc = mock.Mock(spec=io.TextIOWrapper)
215+
opener = mock.mock_open(file_desc)
216+
with mock.patch('__builtin__.open', return_value=opener):
217+
upload = MediaFileUpload(datafile('test_close'), mimetype='text/plain')
218+
self.assertIs(upload.stream(), file_desc)
219+
del upload
220+
file_desc.close.assert_called_once_with()
221+
212222
def test_media_file_upload_mimetype_detection(self):
213223
upload = MediaFileUpload(datafile('small.png'))
214224
self.assertEqual('image/png', upload.mimetype())
@@ -861,7 +871,7 @@ def test_empty_content_type(self):
861871
headers={'content-type': ''})
862872
request.execute()
863873
self.assertEqual('', http.headers.get('content-type'))
864-
874+
865875
def test_no_retry_connection_errors(self):
866876
model = JsonModel()
867877
request = HttpRequest(

0 commit comments

Comments
 (0)