]> granicus.if.org Git - python/commitdiff
Patch #1668100: urllib2 now correctly raises URLError instead of
authorGeorg Brandl <georg@python.org>
Tue, 13 Mar 2007 08:14:27 +0000 (08:14 +0000)
committerGeorg Brandl <georg@python.org>
Tue, 13 Mar 2007 08:14:27 +0000 (08:14 +0000)
OSError if accessing a local file via the file:// protocol fails.

Lib/test/test_urllib2.py
Lib/urllib2.py
Misc/NEWS

index 5ca760ef4bf609ea2ab04914d547adb105e8b232..a23d61e043cd27c6db33b5253282d52dcee41a92 100644 (file)
@@ -626,11 +626,11 @@ class HandlerTests(unittest.TestCase):
 
         for url in [
             "file://localhost:80%s" % urlpath,
-# XXXX bug: these fail with socket.gaierror, should be URLError
-##             "file://%s:80%s/%s" % (socket.gethostbyname('localhost'),
-##                                    os.getcwd(), TESTFN),
-##             "file://somerandomhost.ontheinternet.com%s/%s" %
-##             (os.getcwd(), TESTFN),
+            "file:///file_does_not_exist.txt",
+            "file://%s:80%s/%s" % (socket.gethostbyname('localhost'),
+                                   os.getcwd(), TESTFN),
+            "file://somerandomhost.ontheinternet.com%s/%s" %
+            (os.getcwd(), TESTFN),
             ]:
             try:
                 f = open(TESTFN, "wb")
index ba33030dce3d21fb0cb7e4030b158743ccceec88..046470aa2475bf23cffa2b55270b7e1e0fd82a60 100644 (file)
@@ -1214,19 +1214,23 @@ class FileHandler(BaseHandler):
         host = req.get_host()
         file = req.get_selector()
         localfile = url2pathname(file)
-        stats = os.stat(localfile)
-        size = stats.st_size
-        modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
-        mtype = mimetypes.guess_type(file)[0]
-        headers = mimetools.Message(StringIO(
-            'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' %
-            (mtype or 'text/plain', size, modified)))
-        if host:
-            host, port = splitport(host)
-        if not host or \
-           (not port and socket.gethostbyname(host) in self.get_names()):
-            return addinfourl(open(localfile, 'rb'),
-                              headers, 'file:'+file)
+        try:
+            stats = os.stat(localfile)
+            size = stats.st_size
+            modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
+            mtype = mimetypes.guess_type(file)[0]
+            headers = mimetools.Message(StringIO(
+                'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' %
+                (mtype or 'text/plain', size, modified)))
+            if host:
+                host, port = splitport(host)
+            if not host or \
+                (not port and socket.gethostbyname(host) in self.get_names()):
+                return addinfourl(open(localfile, 'rb'),
+                                  headers, 'file:'+file)
+        except OSError, msg:
+            # urllib2 users shouldn't expect OSErrors coming from urlopen()
+            raise URLError(msg)
         raise URLError('file not on local host')
 
 class FTPHandler(BaseHandler):
index 4aae919647450be7ecbd17501636073271c5f4ad..79d242b03a7be9791e3393394b32c14aa05beb4c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -168,6 +168,9 @@ Core and builtins
 Library
 -------
 
+- Patch #1668100: urllib2 now correctly raises URLError instead of
+  OSError if accessing a local file via the file:// protocol fails.
+
 - Patch #1677862: Require a space or tab after import in .pth files.
 
 - Patch #1192590: Fix pdb's "ignore" and "condition" commands so they trap