File tree 4 files changed +15
-5
lines changed
4 files changed +15
-5
lines changed Original file line number Diff line number Diff line change @@ -15,14 +15,17 @@ def url2pathname(url):
15
15
# become
16
16
# C:\foo\bar\spam.foo
17
17
import string , urllib .parse
18
+ if url [:3 ] == '///' :
19
+ # URL has an empty authority section, so the path begins on the third
20
+ # character.
21
+ url = url [2 :]
22
+ elif url [:12 ] == '//localhost/' :
23
+ # Skip past 'localhost' authority.
24
+ url = url [11 :]
18
25
# Windows itself uses ":" even in URLs.
19
26
url = url .replace (':' , '|' )
20
27
if not '|' in url :
21
28
# No drive specifier, just convert slashes
22
- if url [:3 ] == '///' :
23
- # URL has an empty authority section, so the path begins on the
24
- # third character.
25
- url = url [2 :]
26
29
# make sure not to convert quoted slashes :-)
27
30
return urllib .parse .unquote (url .replace ('/' , '\\ ' ))
28
31
comp = url .split ('|' )
Original file line number Diff line number Diff line change @@ -1496,6 +1496,8 @@ def test_url2pathname_win(self):
1496
1496
# Localhost paths
1497
1497
self .assertEqual (fn ('//localhost/C:/path/to/file' ), 'C:\\ path\\ to\\ file' )
1498
1498
self .assertEqual (fn ('//localhost/C|/path/to/file' ), 'C:\\ path\\ to\\ file' )
1499
+ self .assertEqual (fn ('//localhost/path/to/file' ), '\\ path\\ to\\ file' )
1500
+ self .assertEqual (fn ('//localhost//server/path/to/file' ), '\\ \\ server\\ path\\ to\\ file' )
1499
1501
# Percent-encoded forward slashes are preserved for backwards compatibility
1500
1502
self .assertEqual (fn ('C:/foo%2fbar' ), 'C:\\ foo/bar' )
1501
1503
self .assertEqual (fn ('//server/share/foo%2fbar' ), '\\ \\ server\\ share\\ foo/bar' )
@@ -1514,7 +1516,7 @@ def test_url2pathname_posix(self):
1514
1516
self .assertEqual (fn ('//foo/bar' ), '//foo/bar' )
1515
1517
self .assertEqual (fn ('///foo/bar' ), '/foo/bar' )
1516
1518
self .assertEqual (fn ('////foo/bar' ), '//foo/bar' )
1517
- self .assertEqual (fn ('//localhost/foo/bar' ), '//localhost/ foo/bar' )
1519
+ self .assertEqual (fn ('//localhost/foo/bar' ), '/foo/bar' )
1518
1520
1519
1521
@unittest .skipUnless (os_helper .FS_NONASCII , 'need os_helper.FS_NONASCII' )
1520
1522
def test_url2pathname_nonascii (self ):
Original file line number Diff line number Diff line change @@ -1657,6 +1657,9 @@ def url2pathname(pathname):
1657
1657
# URL has an empty authority section, so the path begins on the
1658
1658
# third character.
1659
1659
pathname = pathname [2 :]
1660
+ elif pathname [:12 ] == '//localhost/' :
1661
+ # Skip past 'localhost' authority.
1662
+ pathname = pathname [11 :]
1660
1663
encoding = sys .getfilesystemencoding ()
1661
1664
errors = sys .getfilesystemencodeerrors ()
1662
1665
return unquote (pathname , encoding = encoding , errors = errors )
Original file line number Diff line number Diff line change
1
+ Fix issue where :func: `urllib.request.url2pathname ` failed to discard any
2
+ 'localhost' authority present in the URL.
You can’t perform that action at this time.
0 commit comments