From 383c32dd3821828f271c0bf7bcf21f0ba71792e8 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Thu, 14 Oct 2010 11:57:35 +0000 Subject: [PATCH] Issue10063 - file:// scheme will stop accessing remote hosts via ftp protocol --- Doc/library/urllib.request.rst | 8 ++++++-- Lib/test/test_urllib2.py | 4 ++-- Lib/urllib/request.py | 6 +++--- Misc/NEWS | 6 ++++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 21c1c2fd31c..5581f25dfd7 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1004,8 +1004,12 @@ FileHandler Objects .. method:: FileHandler.file_open(req) Open the file locally, if there is no host name, or the host name is - ``'localhost'``. Change the protocol to ``ftp`` otherwise, and retry opening it - using :attr:`parent`. + ``'localhost'``. + + This method is applicable only for local hostnames. When a remote hostname + is given, an :exc:`URLError` is raised. + +.. versionchanged:: 3.2 .. _ftp-handler-objects: diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 5a168ee2d80..8d59180e86f 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -731,11 +731,11 @@ class HandlerTests(unittest.TestCase): # file:///blah.txt (a file) # file://ftp.example.com/blah.txt (an ftp URL) for url, ftp in [ - ("file://ftp.example.com//foo.txt", True), + ("file://ftp.example.com//foo.txt", False), ("file://ftp.example.com///foo.txt", False), # XXXX bug: fails with OSError, should be URLError ("file://ftp.example.com/foo.txt", False), - ("file://somehost//foo/something.txt", True), + ("file://somehost//foo/something.txt", False), ("file://localhost//foo/something.txt", False), ]: req = Request(url) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index e2845c9b5e6..9674b96ff1d 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1228,8 +1228,8 @@ class FileHandler(BaseHandler): url = req.selector if url[:2] == '//' and url[2:3] != '/' and (req.host and req.host != 'localhost'): - req.type = 'ftp' - return self.parent.open(req) + if not req.host is self.get_names(): + raise URLError("file:// scheme is supported only on localhost") else: return self.open_local_file(req) @@ -1712,7 +1712,7 @@ class URLopener: if not isinstance(url, str): 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/': - return self.open_ftp(url) + raise ValueError("file:// scheme is supported only on localhost") else: return self.open_local_file(url) diff --git a/Misc/NEWS b/Misc/NEWS index 4392432b21b..c8a43b5834e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,12 @@ Core and Builtins Library ------- +- Issue #Issue10063: file:// scheme will stop accessing remote hosts via ftp + protocol. file:// urls had fallback to access remote hosts via ftp. This was + not correct, change is made to raise a URLError when a remote host is tried + to access via file:// scheme. + + - Issue #1710703: Write structures for an empty ZIP archive when a ZipFile is created in modes 'a' or 'w' and then closed without adding any files. Raise BadZipfile (rather than IOError) when opening small non-ZIP files.