]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] GH-126205: Fix conversion of UNC paths to file URIs (GH-126208) (#126248)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 31 Oct 2024 16:59:15 +0000 (17:59 +0100)
committerGitHub <noreply@github.com>
Thu, 31 Oct 2024 16:59:15 +0000 (16:59 +0000)
GH-126205: Fix conversion of UNC paths to file URIs (GH-126208)

File URIs for Windows UNC paths should begin with two slashes, not four.
(cherry picked from commit 951cb2c369e8b8fb9f93662658391a53fd727787)

Co-authored-by: Barney Gale <barney.gale@gmail.com>
Lib/nturl2path.py
Lib/test/test_urllib.py
Misc/NEWS.d/next/Library/2024-10-30-20-45-17.gh-issue-126205.CHEmtx.rst [new file with mode: 0644]

index 61852aff58912d81f7969b64df5fd1ef2f06fd92..6453f202c26d146642b352c3b51334b8532bd2e6 100644 (file)
@@ -55,16 +55,11 @@ def pathname2url(p):
     if p[:4] == '\\\\?\\':
         p = p[4:]
         if p[:4].upper() == 'UNC\\':
-            p = '\\' + p[4:]
+            p = '\\\\' + p[4:]
         elif p[1:2] != ':':
             raise OSError('Bad path: ' + p)
     if not ':' in p:
         # No drive specifier, just convert slashes and quote the name
-        if p[:2] == '\\\\':
-        # path is something like \\host\path\on\remote\host
-        # convert this to ////host/path/on/remote/host
-        # (notice doubling of slashes at the start of the path)
-            p = '\\\\' + p
         components = p.split('\\')
         return urllib.parse.quote('/'.join(components))
     comp = p.split(':', maxsplit=2)
index 5a6d877f6a309445213a455fa2cfb618d5e9e2c5..0e1b13d31c92734709e1bd268339a072ee7911c1 100644 (file)
@@ -1533,7 +1533,7 @@ class Pathname_Tests(unittest.TestCase):
         # Test special prefixes are correctly handled in pathname2url()
         fn = urllib.request.pathname2url
         self.assertEqual(fn('\\\\?\\C:\\dir'), '///C:/dir')
-        self.assertEqual(fn('\\\\?\\unc\\server\\share\\dir'), '/server/share/dir')
+        self.assertEqual(fn('\\\\?\\unc\\server\\share\\dir'), '//server/share/dir')
         self.assertEqual(fn("C:"), '///C:')
         self.assertEqual(fn("C:\\"), '///C:')
         self.assertEqual(fn('C:\\a\\b.c'), '///C:/a/b.c')
@@ -1544,14 +1544,14 @@ class Pathname_Tests(unittest.TestCase):
         self.assertRaises(IOError, fn, "XX:\\")
         # No drive letter
         self.assertEqual(fn("\\folder\\test\\"), '/folder/test/')
-        self.assertEqual(fn("\\\\folder\\test\\"), '////folder/test/')
-        self.assertEqual(fn("\\\\\\folder\\test\\"), '/////folder/test/')
-        self.assertEqual(fn('\\\\some\\share\\'), '////some/share/')
-        self.assertEqual(fn('\\\\some\\share\\a\\b.c'), '////some/share/a/b.c')
-        self.assertEqual(fn('\\\\some\\share\\a\\b%#c\xe9'), '////some/share/a/b%25%23c%C3%A9')
+        self.assertEqual(fn("\\\\folder\\test\\"), '//folder/test/')
+        self.assertEqual(fn("\\\\\\folder\\test\\"), '///folder/test/')
+        self.assertEqual(fn('\\\\some\\share\\'), '//some/share/')
+        self.assertEqual(fn('\\\\some\\share\\a\\b.c'), '//some/share/a/b.c')
+        self.assertEqual(fn('\\\\some\\share\\a\\b%#c\xe9'), '//some/share/a/b%25%23c%C3%A9')
         # Round-tripping
         urls = ['///C:',
-                '/////folder/test/',
+                '///folder/test/',
                 '///C:/foo/bar/spam.foo']
         for url in urls:
             self.assertEqual(fn(urllib.request.url2pathname(url)), url)
diff --git a/Misc/NEWS.d/next/Library/2024-10-30-20-45-17.gh-issue-126205.CHEmtx.rst b/Misc/NEWS.d/next/Library/2024-10-30-20-45-17.gh-issue-126205.CHEmtx.rst
new file mode 100644 (file)
index 0000000..c92ffb7
--- /dev/null
@@ -0,0 +1,2 @@
+Fix issue where :func:`urllib.request.pathname2url` generated URLs beginning
+with four slashes (rather than two) when given a Windows UNC path.