diff options
author | Senthil Kumaran <senthil@uthcode.com> | 2012-10-27 09:48:21 (GMT) |
---|---|---|
committer | Senthil Kumaran <senthil@uthcode.com> | 2012-10-27 09:48:21 (GMT) |
commit | cc2f0421c70d6a68e026d074b7d1c7fa4d96e6b8 (patch) | |
tree | 05de9f6d7fdfcfd39d836696e2d9d8d2cc631d7b /Lib | |
parent | 5f9459fbedae091bff5b87189014a996f1352b1c (diff) | |
parent | cad7b314674588f0a079de78945f8fc28d38af8c (diff) | |
download | cpython-cc2f0421c70d6a68e026d074b7d1c7fa4d96e6b8.zip cpython-cc2f0421c70d6a68e026d074b7d1c7fa4d96e6b8.tar.gz cpython-cc2f0421c70d6a68e026d074b7d1c7fa4d96e6b8.tar.bz2 |
Issue #16250: Fix URLError invocation with proper args
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_urllib.py | 35 | ||||
-rw-r--r-- | Lib/urllib/request.py | 30 |
2 files changed, 49 insertions, 16 deletions
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 22ada56..623eb5e 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -268,6 +268,39 @@ Content-Type: text/html; charset=iso-8859-1 finally: self.unfakehttp() + def test_missing_localfile(self): + # Test for #10836 + # 3.3 - URLError is not captured, explicit IOError is raised. + with self.assertRaises(IOError): + urlopen('file://localhost/a/file/which/doesnot/exists.py') + + def test_file_notexists(self): + fd, tmp_file = tempfile.mkstemp() + tmp_fileurl = 'file://localhost/' + tmp_file.replace(os.path.sep, '/') + try: + self.assertTrue(os.path.exists(tmp_file)) + with urlopen(tmp_fileurl) as fobj: + self.assertTrue(fobj) + finally: + os.close(fd) + os.unlink(tmp_file) + self.assertFalse(os.path.exists(tmp_file)) + # 3.3 - IOError instead of URLError + with self.assertRaises(IOError): + urlopen(tmp_fileurl) + + def test_ftp_nohost(self): + test_ftp_url = 'ftp:///path' + # 3.3 - IOError instead of URLError + with self.assertRaises(IOError): + urlopen(test_ftp_url) + + def test_ftp_nonexisting(self): + # 3.3 - IOError instead of URLError + with self.assertRaises(IOError): + urlopen('ftp://localhost/a/file/which/doesnot/exists.py') + + def test_userpass_inurl(self): self.fakehttp(b"HTTP/1.0 200 OK\r\n\r\nHello!") try: @@ -300,7 +333,7 @@ Content-Type: text/html; charset=iso-8859-1 def test_URLopener_deprecation(self): with support.check_warnings(('',DeprecationWarning)): - warn = urllib.request.URLopener() + urllib.request.URLopener() class urlretrieve_FileTests(unittest.TestCase): """Test urllib.urlretrieve() on local files""" diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 88f3ce1..27ab2b9 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1413,9 +1413,9 @@ class FileHandler(BaseHandler): else: origurl = 'file://' + filename return addinfourl(open(localfile, 'rb'), headers, origurl) - except OSError as msg: + except OSError as exp: # users shouldn't expect OSErrors coming from urlopen() - raise URLError(msg) + raise URLError(exp) raise URLError('file not on local host') def _safe_gethostbyname(host): @@ -1474,8 +1474,8 @@ class FTPHandler(BaseHandler): headers += "Content-length: %d\n" % retrlen headers = email.message_from_string(headers) return addinfourl(fp, headers, req.full_url) - except ftplib.all_errors as msg: - exc = URLError('ftp error: %s' % msg) + except ftplib.all_errors as exp: + exc = URLError('ftp error: %r' % exp) raise exc.with_traceback(sys.exc_info()[2]) def connect_ftp(self, user, passwd, host, port, dirs, timeout): @@ -1870,7 +1870,7 @@ class URLopener: def open_file(self, url): """Use local file or FTP depending on form of URL.""" if not isinstance(url, str): - raise URLError('file error', 'proxy support for file protocol currently not implemented') + raise URLError('file error: proxy support for file protocol currently not implemented') if url[:2] == '//' and url[2:3] != '/' and url[2:12].lower() != 'localhost/': raise ValueError("file:// scheme is supported only on localhost") else: @@ -1885,7 +1885,7 @@ class URLopener: try: stats = os.stat(localname) except OSError as e: - raise URLError(e.errno, e.strerror, e.filename) + raise URLError(e.strerror, e.filename) size = stats.st_size modified = email.utils.formatdate(stats.st_mtime, usegmt=True) mtype = mimetypes.guess_type(url)[0] @@ -1899,22 +1899,22 @@ class URLopener: return addinfourl(open(localname, 'rb'), headers, urlfile) host, port = splitport(host) if (not port - and socket.gethostbyname(host) in (localhost() + thishost())): + and socket.gethostbyname(host) in ((localhost(),) + thishost())): urlfile = file if file[:1] == '/': urlfile = 'file://' + file elif file[:2] == './': raise ValueError("local file url may start with / or file:. Unknown url of type: %s" % url) return addinfourl(open(localname, 'rb'), headers, urlfile) - raise URLError('local file error', 'not on local host') + raise URLError('local file error: not on local host') def open_ftp(self, url): """Use FTP protocol.""" if not isinstance(url, str): - raise URLError('ftp error', 'proxy support for ftp protocol currently not implemented') + raise URLError('ftp error: proxy support for ftp protocol currently not implemented') import mimetypes host, path = splithost(url) - if not host: raise URLError('ftp error', 'no host given') + if not host: raise URLError('ftp error: no host given') host, port = splitport(host) user, host = splituser(host) if user: user, passwd = splitpasswd(user) @@ -1963,13 +1963,13 @@ class URLopener: headers += "Content-Length: %d\n" % retrlen headers = email.message_from_string(headers) return addinfourl(fp, headers, "ftp:" + url) - except ftperrors() as msg: - raise URLError('ftp error', msg).with_traceback(sys.exc_info()[2]) + except ftperrors() as exp: + raise URLError('ftp error %r' % exp).with_traceback(sys.exc_info()[2]) def open_data(self, url, data=None): """Use "data" URL.""" if not isinstance(url, str): - raise URLError('data error', 'proxy support for data protocol currently not implemented') + raise URLError('data error: proxy support for data protocol currently not implemented') # ignore POSTed data # # syntax of data URLs: @@ -2298,7 +2298,7 @@ class ftpwrapper: conn, retrlen = self.ftp.ntransfercmd(cmd) except ftplib.error_perm as reason: if str(reason)[:3] != '550': - raise URLError('ftp error', reason).with_traceback( + raise URLError('ftp error: %d' % reason).with_traceback( sys.exc_info()[2]) if not conn: # Set transfer mode to ASCII! @@ -2310,7 +2310,7 @@ class ftpwrapper: try: self.ftp.cwd(file) except ftplib.error_perm as reason: - raise URLError('ftp error', reason) from reason + raise URLError('ftp error: %d' % reason) from reason finally: self.ftp.cwd(pwd) cmd = 'LIST ' + file |