convert a nt pathname to a file url and vice versa this module only exists to provide osspecific code for urllib requests thus do not use directly testing is done through testurllib osspecific conversion from a relative url of the file scheme to a file system path not recommended for general use e g cfoobarspam foo and c foobarspam foo become c foobarspam 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 hostpathonremotehost convert this to hostpathonremotehost notice halving of slashes at the start of the path url url2 components url split make sure not to convert quoted slashes return urllib parse unquote joincomponents comp url split if lencomp 2 or comp01 not in string asciiletters error bad url url raise oserrorerror drive comp01 upper components comp1 split path drive for comp in components if comp path path urllib parse unquotecomp issue 11474 handing url such as c if path endswith and url endswith path return path def pathname2urlp e g c foobarspam foo becomes c foobarspam foo first clean up some special forms we are going to sacrifice the additional information anyway no drive specifier just convert slashes and quote the name path is something like hostpathonremotehost convert this to hostpathonremotehost notice doubling of slashes at the start of the path testing is done through test_urllib 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 windows itself uses even in urls no drive specifier just convert slashes 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 make sure not to convert quoted slashes issue 11474 handing url such as c 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 first clean up some special forms we are going to sacrifice the additional information anyway no drive specifier just convert slashes and quote the name 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
def url2pathname(url):
    
    
    
    
    
    
    
    import string, urllib.parse
    
    url = url.replace(':', '|')
    if not '|' in url:
        
        if url[:4] == '////':
            
            
            
            url = url[2:]
        components = url.split('/')
        
        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)
    
    if path.endswith(':') and url.endswith('/'):
        path += '\\'
    return path

def pathname2url(p):
    
    
    
    
    
    import urllib.parse
    
    
    if p[:4] == '\\\\?\\':
        p = p[4:]
        if p[:4].upper() == 'UNC\\':
            p = '\\' + p[4:]
        elif p[1:2] != ':':
            raise OSError('Bad path: ' + p)
    if not ':' in p:
        
        if p[:2] == '\\\\':
        
        
        
            p = '\\\\' + p
        components = p.split('\\')
        return urllib.parse.quote('/'.join(components))
    comp = p.split(':', maxsplit=2)
    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