GH-127078: url2pathname(): handle extra slash before UNC drive in URL path (#127132)

Decode a file URI like `file://///server/share` as a UNC path like
`\\server\share`. This form of file URI is created by software the simply
prepends `file:///` to any absolute Windows path.
This commit is contained in:
Barney Gale 2024-11-22 04:12:50 +00:00 committed by GitHub
parent ebf564a1d3
commit 8c98ed846a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 6 additions and 1 deletions

View File

@ -22,6 +22,9 @@ def url2pathname(url):
elif url[:12] == '//localhost/': elif url[:12] == '//localhost/':
# Skip past 'localhost' authority. # Skip past 'localhost' authority.
url = url[11:] url = url[11:]
if url[:3] == '///':
# Skip past extra slash before UNC drive in URL path.
url = url[1:]
# Windows itself uses ":" even in URLs. # Windows itself uses ":" even in URLs.
url = url.replace(':', '|') url = url.replace(':', '|')
if not '|' in url: if not '|' in url:

View File

@ -1492,7 +1492,7 @@ class Pathname_Tests(unittest.TestCase):
# UNC paths # UNC paths
self.assertEqual(fn('//server/path/to/file'), '\\\\server\\path\\to\\file') self.assertEqual(fn('//server/path/to/file'), '\\\\server\\path\\to\\file')
self.assertEqual(fn('////server/path/to/file'), '\\\\server\\path\\to\\file') self.assertEqual(fn('////server/path/to/file'), '\\\\server\\path\\to\\file')
self.assertEqual(fn('/////server/path/to/file'), '\\\\\\server\\path\\to\\file') self.assertEqual(fn('/////server/path/to/file'), '\\\\server\\path\\to\\file')
# Localhost paths # Localhost paths
self.assertEqual(fn('//localhost/C:/path/to/file'), 'C:\\path\\to\\file') self.assertEqual(fn('//localhost/C:/path/to/file'), 'C:\\path\\to\\file')
self.assertEqual(fn('//localhost/C|/path/to/file'), 'C:\\path\\to\\file') self.assertEqual(fn('//localhost/C|/path/to/file'), 'C:\\path\\to\\file')

View File

@ -0,0 +1,2 @@
Fix issue where :func:`urllib.request.url2pathname` failed to discard an
extra slash before a UNC drive in the URL path on Windows.