Index: Lib/test/test_urllib.py =================================================================== --- Lib/test/test_urllib.py (revision 63928) +++ Lib/test/test_urllib.py (working copy) @@ -2,11 +2,11 @@ import urllib import http.client +import email.message import io import unittest from test import support import os -import mimetools import tempfile def hexescape(char): @@ -78,7 +78,7 @@ self.returned_obj.close() def test_info(self): - self.assert_(isinstance(self.returned_obj.info(), mimetools.Message)) + self.assert_(isinstance(self.returned_obj.info(), email.message.Message)) def test_geturl(self): self.assertEqual(self.returned_obj.geturl(), self.pathname) @@ -206,8 +206,8 @@ # a headers value is returned. result = urllib.urlretrieve("file:%s" % support.TESTFN) self.assertEqual(result[0], support.TESTFN) - self.assert_(isinstance(result[1], mimetools.Message), - "did not get a mimetools.Message instance as second " + self.assert_(isinstance(result[1], email.message.Message), + "did not get a email.message.Message instance as second " "returned value") def test_copy(self): Index: Lib/urllib.py =================================================================== --- Lib/urllib.py (revision 63928) +++ Lib/urllib.py (working copy) @@ -17,12 +17,14 @@ protocol. All you know is that is has methods read(), readline(), readlines(), fileno(), close() and info(). The read*(), fileno() and close() methods work like those of open files. -The info() method returns a mimetools.Message object which can be +The info() method returns a email.message.Message object which can be used to query various info about the object, if available. -(mimetools.Message objects are queried with the getheader() method.) +(email.message.Message objects provide a dict-like interface.) """ import http.client +import email.message +import email import os import socket import sys @@ -414,8 +416,7 @@ def open_local_file(self, url): """Use local file.""" - import mimetypes, mimetools, email.utils - from io import StringIO + import mimetypes, email.utils host, file = splithost(url) localname = url2pathname(file) try: @@ -425,9 +426,9 @@ size = stats.st_size modified = email.utils.formatdate(stats.st_mtime, usegmt=True) mtype = mimetypes.guess_type(url)[0] - headers = mimetools.Message(StringIO( + headers = email.message_from_string( 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' % - (mtype or 'text/plain', size, modified))) + (mtype or 'text/plain', size, modified)) if not host: urlfile = file if file[:1] == '/': @@ -448,8 +449,7 @@ """Use FTP protocol.""" if not isinstance(url, str): raise IOError('ftp error', 'proxy support for ftp protocol currently not implemented') - import mimetypes, mimetools - from io import StringIO + import mimetypes host, path = splithost(url) if not host: raise IOError('ftp error', 'no host given') host, port = splitport(host) @@ -498,7 +498,7 @@ headers += "Content-Type: %s\n" % mtype if retrlen is not None and retrlen >= 0: headers += "Content-Length: %d\n" % retrlen - headers = mimetools.Message(StringIO(headers)) + headers = email.message_from_string(headers) return addinfourl(fp, headers, "ftp:" + url) except ftperrors() as msg: raise IOError('ftp error', msg).with_traceback(sys.exc_info()[2]) @@ -514,7 +514,6 @@ # mediatype := [ type "/" subtype ] *( ";" parameter ) # data := *urlchar # parameter := attribute "=" value - import mimetools from io import StringIO try: [type, data] = url.split(',', 1) @@ -541,8 +540,8 @@ msg.append('') msg.append(data) msg = '\n'.join(msg) + headers = email.message_from_string(msg) f = StringIO(msg) - headers = mimetools.Message(f, 0) #f.fileno = None # needed for addinfourl return addinfourl(f, headers, url) @@ -761,13 +760,10 @@ _noheaders = None def noheaders(): - """Return an empty mimetools.Message object.""" + """Return an empty email.message.Message object.""" global _noheaders if _noheaders is None: - import mimetools - from io import StringIO - _noheaders = mimetools.Message(StringIO(), 0) - _noheaders.fp.close() # Recycle file descriptor + _noheaders = email.message.Message() return _noheaders