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(