| 
									
										
										
										
											2017-03-17 20:16:20 +02:00
										 |  |  | """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. | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2025-03-19 19:33:01 +00:00
										 |  |  | # Testing is done through test_nturl2path. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import warnings | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | warnings._deprecated( | 
					
						
							|  |  |  |     __name__, | 
					
						
							|  |  |  |     message=f"{warnings._DEPRECATED_MSG}; use 'urllib.request' instead", | 
					
						
							|  |  |  |     remove=(3, 19)) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:47:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def url2pathname(url): | 
					
						
							| 
									
										
										
										
											2005-12-26 22:53:56 +00:00
										 |  |  |     """OS-specific conversion from a relative URL of the 'file' scheme
 | 
					
						
							|  |  |  |     to a file system path; not recommended for general use."""
 | 
					
						
							|  |  |  |     # e.g. | 
					
						
							| 
									
										
										
										
											2015-10-24 17:39:36 +03:00
										 |  |  |     #   ///C|/foo/bar/spam.foo | 
					
						
							|  |  |  |     # and | 
					
						
							|  |  |  |     #   ///C:/foo/bar/spam.foo | 
					
						
							|  |  |  |     # become | 
					
						
							|  |  |  |     #   C:\foo\bar\spam.foo | 
					
						
							| 
									
										
										
										
											2025-03-18 23:37:12 +00:00
										 |  |  |     import urllib.parse | 
					
						
							| 
									
										
										
										
											2024-11-22 03:17:06 +00:00
										 |  |  |     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:] | 
					
						
							| 
									
										
										
										
											2024-11-22 04:12:50 +00:00
										 |  |  |     if url[:3] == '///': | 
					
						
							|  |  |  |         # Skip past extra slash before UNC drive in URL path. | 
					
						
							|  |  |  |         url = url[1:] | 
					
						
							| 
									
										
										
										
											2025-03-18 23:37:12 +00:00
										 |  |  |     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('/', '\\')) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:47:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def pathname2url(p): | 
					
						
							| 
									
										
										
										
											2005-12-26 22:53:56 +00:00
										 |  |  |     """OS-specific conversion from a file system path to a relative URL
 | 
					
						
							|  |  |  |     of the 'file' scheme; not recommended for general use."""
 | 
					
						
							|  |  |  |     # e.g. | 
					
						
							| 
									
										
										
										
											2015-10-24 17:39:36 +03:00
										 |  |  |     #   C:\foo\bar\spam.foo | 
					
						
							| 
									
										
										
										
											2005-12-26 22:53:56 +00:00
										 |  |  |     # becomes | 
					
						
							| 
									
										
										
										
											2015-10-24 17:39:36 +03:00
										 |  |  |     #   ///C:/foo/bar/spam.foo | 
					
						
							| 
									
										
										
										
											2024-11-22 00:29:05 +00:00
										 |  |  |     import ntpath | 
					
						
							| 
									
										
										
										
											2008-06-18 22:38:24 +00:00
										 |  |  |     import urllib.parse | 
					
						
							| 
									
										
										
										
											2021-04-23 18:02:47 +01:00
										 |  |  |     # First, clean up some special forms. We are going to sacrifice | 
					
						
							|  |  |  |     # the additional information anyway | 
					
						
							| 
									
										
										
										
											2024-11-12 19:52:30 +00:00
										 |  |  |     p = p.replace('\\', '/') | 
					
						
							|  |  |  |     if p[:4] == '//?/': | 
					
						
							| 
									
										
										
										
											2021-04-23 18:02:47 +01:00
										 |  |  |         p = p[4:] | 
					
						
							| 
									
										
										
										
											2024-11-12 19:52:30 +00:00
										 |  |  |         if p[:4].upper() == 'UNC/': | 
					
						
							|  |  |  |             p = '//' + p[4:] | 
					
						
							| 
									
										
										
										
											2024-11-25 19:59:20 +00:00
										 |  |  |     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}' | 
					
						
							| 
									
										
										
										
											1996-06-26 19:47:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-22 00:29:05 +00:00
										 |  |  |     tail = urllib.parse.quote(tail) | 
					
						
							| 
									
										
										
										
											2024-11-25 19:59:20 +00:00
										 |  |  |     return drive + root + tail |