]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-137059: `url2pathname()`: fix support for drive letter in netloc (#137060)
authorBarney Gale <barney.gale@gmail.com>
Sun, 27 Jul 2025 11:44:41 +0000 (12:44 +0100)
committerGitHub <noreply@github.com>
Sun, 27 Jul 2025 11:44:41 +0000 (11:44 +0000)
Support file URLs like `file://c:/foo` in `urllib.request.url2pathname()`
on Windows. This restores behaviour from 3.13.

Lib/test/test_urllib.py
Lib/urllib/request.py
Misc/NEWS.d/next/Library/2025-07-24-00-38-07.gh-issue-137059.fr64oW.rst [new file with mode: 0644]

index c30fb5e27eea8aeb5c0cb24f42317c108cd9ab29..ae524c5ffba6b1f6cafb7fa20bdebf3712acfe4b 100644 (file)
@@ -1590,6 +1590,10 @@ class Pathname_Tests(unittest.TestCase):
     def test_url2pathname_win(self):
         fn = urllib.request.url2pathname
         self.assertEqual(fn('/C:/'), 'C:\\')
+        self.assertEqual(fn('//C:'), 'C:')
+        self.assertEqual(fn('//C:/'), 'C:\\')
+        self.assertEqual(fn('//C:\\'), 'C:\\')
+        self.assertEqual(fn('//C:80/'), 'C:80\\')
         self.assertEqual(fn("///C|"), 'C:')
         self.assertEqual(fn("///C:"), 'C:')
         self.assertEqual(fn('///C:/'), 'C:\\')
index c1c373d08815c1dad0660d6322183938f1752b55..af93d4cd75dbef2016cc11cdbae058a459d878ef 100644 (file)
@@ -1660,7 +1660,10 @@ def url2pathname(url, *, require_scheme=False, resolve_host=False):
     if scheme != 'file':
         raise URLError("URL is missing a 'file:' scheme")
     if os.name == 'nt':
-        if not _is_local_authority(authority, resolve_host):
+        if authority[1:2] == ':':
+            # e.g. file://c:/file.txt
+            url = authority + url
+        elif not _is_local_authority(authority, resolve_host):
             # e.g. file://server/share/file.txt
             url = '//' + authority + url
         elif url[:3] == '///':
diff --git a/Misc/NEWS.d/next/Library/2025-07-24-00-38-07.gh-issue-137059.fr64oW.rst b/Misc/NEWS.d/next/Library/2025-07-24-00-38-07.gh-issue-137059.fr64oW.rst
new file mode 100644 (file)
index 0000000..8c63c1f
--- /dev/null
@@ -0,0 +1,3 @@
+Fix handling of file URLs with a Windows drive letter in the URL authority
+by :func:`urllib.request.url2pathname`. This fixes a regression in earlier
+pre-releases of Python 3.14.