mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	Deprecate the `nturl2path` module. Its functionality is merged into `urllib.request`. Add `tests.test_nturl2path` to exercise `nturl2path`, as it's no longer covered by `test_urllib`.
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""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_nturl2path.
 | 
						|
 | 
						|
import warnings
 | 
						|
 | 
						|
 | 
						|
warnings._deprecated(
 | 
						|
    __name__,
 | 
						|
    message=f"{warnings._DEPRECATED_MSG}; use 'urllib.request' instead",
 | 
						|
    remove=(3, 19))
 | 
						|
 | 
						|
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 urllib.parse
 | 
						|
    if url[:3] == '///':
 | 
						|
        # URL has an empty authority section, so the path begins on the third
 | 
						|
        # character.
 | 
						|
        url = url[2:]
 | 
						|
    elif url[:12] == '//localhost/':
 | 
						|
        # Skip past 'localhost' authority.
 | 
						|
        url = url[11:]
 | 
						|
    if url[:3] == '///':
 | 
						|
        # Skip past extra slash before UNC drive in URL path.
 | 
						|
        url = url[1:]
 | 
						|
    else:
 | 
						|
        if url[:1] == '/' and url[2:3] in (':', '|'):
 | 
						|
            # Skip past extra slash before DOS drive in URL path.
 | 
						|
            url = url[1:]
 | 
						|
        if url[1:2] == '|':
 | 
						|
            # Older URLs use a pipe after a drive letter
 | 
						|
            url = url[:1] + ':' + url[2:]
 | 
						|
    return urllib.parse.unquote(url.replace('/', '\\'))
 | 
						|
 | 
						|
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 ntpath
 | 
						|
    import urllib.parse
 | 
						|
    # First, clean up some special forms. We are going to sacrifice
 | 
						|
    # the additional information anyway
 | 
						|
    p = p.replace('\\', '/')
 | 
						|
    if p[:4] == '//?/':
 | 
						|
        p = p[4:]
 | 
						|
        if p[:4].upper() == 'UNC/':
 | 
						|
            p = '//' + p[4:]
 | 
						|
    drive, root, tail = ntpath.splitroot(p)
 | 
						|
    if drive:
 | 
						|
        if drive[1:] == ':':
 | 
						|
            # DOS drive specified. Add three slashes to the start, producing
 | 
						|
            # an authority section with a zero-length authority, and a path
 | 
						|
            # section starting with a single slash.
 | 
						|
            drive = f'///{drive}'
 | 
						|
        drive = urllib.parse.quote(drive, safe='/:')
 | 
						|
    elif root:
 | 
						|
        # Add explicitly empty authority to path beginning with one slash.
 | 
						|
        root = f'//{root}'
 | 
						|
 | 
						|
    tail = urllib.parse.quote(tail)
 | 
						|
    return drive + root + tail
 |