"""Convert a NT pathname to a file URL and vice versa. This module only exists to provide OS-specific code for urllib.requests, thus do not use directly. """ # Testing is done through test_urllib. def url2pathname(url): """OS-specific conversion from a relative URL of the 'file' scheme to a file system path; not recommended for general use.""" # e.g. # ///C|/foo/bar/spam.foo # and # ///C:/foo/bar/spam.foo # become # C:\foo\bar\spam.foo import string, urllib.parse # Windows itself uses ":" even in URLs. url = url.replace(':', '|') if not '|' in url: # No drive specifier, just convert slashes if url[:4] == '////': # path is something like ////host/path/on/remote/host # convert this to \\host\path\on\remote\host # (notice halving of slashes at the start of the path) url = url[2:] components = url.split('/') # make sure not to convert quoted slashes :-) return urllib.parse.unquote('\\'.join(components)) comp = url.split('|') if len(comp) != 2 or comp[0][-1] not in string.ascii_letters: error = 'Bad URL: ' + url raise OSError(error) drive = comp[0][-1].upper() components = comp[1].split('/') path = drive + ':' for comp in components: if comp: path = path + '\\' + urllib.parse.unquote(comp) # Issue #11474 - handing url such as |c/| if path.endswith(':') and url.endswith('/'): path += '\\' return path def pathname2url(p): """OS-specific conversion from a file system path to a relative URL of the 'file' scheme; not recommended for general use.""" # e.g. # C:\foo\bar\spam.foo # becomes # ///C:/foo/bar/spam.foo import urllib.parse 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(':') if len(comp) != 2 or len(comp[0]) > 1: error = 'Bad path: ' + p raise OSError(error) drive = urllib.parse.quote(comp[0].upper()) components = comp[1].split('\\') path = '///' + drive + ':' for comp in components: if comp: path = path + '/' + urllib.parse.quote(comp) return path
Mode | Type | Size | Ref | File |
---|---|---|---|---|
100644 | blob | 582 | 58471109208922c9ee8c4b06135725f03ed16814 | .bzrignore |
100644 | blob | 545 | fcf9df6a7a698e4bd87ed0c1cc4ed70bad8b9887 | .codecov.yml |
100644 | blob | 255 | 82694d81f276b2c59a0a93a4f678e1852e625052 | .gitattributes |
040000 | tree | - | 7e849e161267e730810fbbe6a848b14d5d002788 | .github |
100644 | blob | 1397 | 8b54c2c4861389f6e8bbfbab5ae0c8b6bbbad041 | .gitignore |
100644 | blob | 1060 | eb19a6c88d28d05588db25d21525ee2e19c22666 | .hgeol |
100644 | blob | 1358 | 68c607f2e8d420c8dfd0748efcd3b3b5447def16 | .hgignore |
100644 | blob | 8917 | 8f51c2ced49aed46d8b480280b630ea4264c57c3 | .hgtags |
100644 | blob | 1328 | b9be0f11fdb829f16e9de1921257eb7ee45fac57 | .hgtouch |
100644 | blob | 248 | 0614a299b6221dc7faedaa9139ae8b034e618a85 | .mention-bot |
100644 | blob | 3512 | e7e8694530ca21a6d7a19da3fab687a3e9d79e9c | .travis.yml |
040000 | tree | - | ab6ef0c3da91d215c813859260aa9d0724504633 | Doc |
040000 | tree | - | 5dd6fc9dc09374506491247872c868eca111e256 | Grammar |
040000 | tree | - | df0de9d4359f11311c74fd0dbad471bb2613a2d4 | Include |
100644 | blob | 12773 | f5d0b39a0cdddb91a31a537052b7d8d31a4aa79f | LICENSE |
040000 | tree | - | 35e9c80068a1b6441f6a676002e031d908be567f | Lib |
040000 | tree | - | 1db7415d4375525eaf8d05ddd5b088de3321041c | Mac |
100644 | blob | 58983 | 4145634c032d543d02295bd2c28a0c6ce839fa86 | Makefile.pre.in |
040000 | tree | - | 6854ababa88443950a60516508b6994cfd8888db | Misc |
040000 | tree | - | 92e4f07c6b277cc3dae87514f9cebce860ec55ba | Modules |
040000 | tree | - | cec92311ba9c836d7f68a2d6e24b27e8287ac690 | Objects |
040000 | tree | - | ed4f35810e9633502c16ae038c2ce697d3987201 | PC |
040000 | tree | - | 37a613ac0022a9cfefaf3f13913fec7debe59259 | PCbuild |
040000 | tree | - | bfcd1ca2e85b8724b1b7be4e0673b90220a04e7c | Parser |
040000 | tree | - | 3efbcc80237ab7c3d4eb5bf31c893ca6de88e747 | Programs |
040000 | tree | - | 8f832869b53d99ee02d78ea0cc8491d3882222da | Python |
100644 | blob | 9325 | 9c95815d9e9d91b8dae8e05d8bbc696fe19f796b | README.rst |
040000 | tree | - | 66b8a7e032e5538a9a2e08422da3716c50e91a4b | Tools |
100644 | blob | 10910 | 9a9cc557281571f0d46c506c0e9d1b9fb25e063c | aclocal.m4 |
100755 | blob | 42856 | 1f5c50c0d1529d50b94dc3533ca72a47f0fa5849 | config.guess |
100755 | blob | 35740 | d654d03cdcd2226a5d7584890717e674a8122f4f | config.sub |
100755 | blob | 485283 | 87504d206837baf5a5781b6e1cc44dcce7138af9 | configure |
100644 | blob | 160661 | f9bd92ce3da29ea7674a32bd5fe511b1fc4c4d0a | configure.ac |
100755 | blob | 7122 | 0ec27bcd488da5cad6ead13d70accbdbc40d31ef | install-sh |
100644 | blob | 41449 | 21354a5cb84fe5530dd0d460561ba95569abe1d4 | pyconfig.h.in |
100644 | blob | 98743 | 3b3d097454211c790c1602d759918bb65a622c97 | setup.py |