mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	GH-136874: url2pathname(): discard query and fragment components (#136875)
				
					
				
			In `urllib.request.url2pathname()`, ignore any query or fragment components in the given URL.
This commit is contained in:
		
							parent
							
								
									4b68289ca6
								
							
						
					
					
						commit
						80b2d60a51
					
				
					 5 changed files with 18 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -210,6 +210,9 @@ The :mod:`urllib.request` module defines the following functions:
 | 
			
		|||
      Windows a UNC path is returned (as before), and on other platforms a
 | 
			
		||||
      :exc:`~urllib.error.URLError` is raised.
 | 
			
		||||
 | 
			
		||||
   .. versionchanged:: 3.14
 | 
			
		||||
      The URL query and fragment components are discarded if present.
 | 
			
		||||
 | 
			
		||||
   .. versionchanged:: 3.14
 | 
			
		||||
      The *require_scheme* and *resolve_host* parameters were added.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2192,6 +2192,7 @@ urllib
 | 
			
		|||
  - Discard URL authority if it matches the local hostname.
 | 
			
		||||
  - Discard URL authority if it resolves to a local IP address when the new
 | 
			
		||||
    *resolve_host* argument is set to true.
 | 
			
		||||
  - Discard URL query and fragment components.
 | 
			
		||||
  - Raise :exc:`~urllib.error.URLError` if a URL authority isn't local,
 | 
			
		||||
    except on Windows where we return a UNC path as before.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1526,6 +1526,14 @@ def test_url2pathname(self):
 | 
			
		|||
        self.assertEqual(fn('////foo/bar'), f'{sep}{sep}foo{sep}bar')
 | 
			
		||||
        self.assertEqual(fn('data:blah'), 'data:blah')
 | 
			
		||||
        self.assertEqual(fn('data://blah'), f'data:{sep}{sep}blah')
 | 
			
		||||
        self.assertEqual(fn('foo?bar'), 'foo')
 | 
			
		||||
        self.assertEqual(fn('foo#bar'), 'foo')
 | 
			
		||||
        self.assertEqual(fn('foo?bar=baz'), 'foo')
 | 
			
		||||
        self.assertEqual(fn('foo?bar#baz'), 'foo')
 | 
			
		||||
        self.assertEqual(fn('foo%3Fbar'), 'foo?bar')
 | 
			
		||||
        self.assertEqual(fn('foo%23bar'), 'foo#bar')
 | 
			
		||||
        self.assertEqual(fn('foo%3Fbar%3Dbaz'), 'foo?bar=baz')
 | 
			
		||||
        self.assertEqual(fn('foo%3Fbar%23baz'), 'foo?bar#baz')
 | 
			
		||||
 | 
			
		||||
    def test_url2pathname_require_scheme(self):
 | 
			
		||||
        sep = os.path.sep
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1654,11 +1654,11 @@ def url2pathname(url, *, require_scheme=False, resolve_host=False):
 | 
			
		|||
    The URL authority may be resolved with gethostbyname() if
 | 
			
		||||
    *resolve_host* is set to true.
 | 
			
		||||
    """
 | 
			
		||||
    if require_scheme:
 | 
			
		||||
        scheme, url = _splittype(url)
 | 
			
		||||
        if scheme != 'file':
 | 
			
		||||
            raise URLError("URL is missing a 'file:' scheme")
 | 
			
		||||
    authority, url = _splithost(url)
 | 
			
		||||
    if not require_scheme:
 | 
			
		||||
        url = 'file:' + url
 | 
			
		||||
    scheme, authority, url = urlsplit(url)[:3]  # Discard query and fragment.
 | 
			
		||||
    if scheme != 'file':
 | 
			
		||||
        raise URLError("URL is missing a 'file:' scheme")
 | 
			
		||||
    if os.name == 'nt':
 | 
			
		||||
        if not _is_local_authority(authority, resolve_host):
 | 
			
		||||
            # e.g. file://server/share/file.txt
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Discard URL query and fragment in :func:`urllib.request.url2pathname`.
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue