mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-01-29 01:27:52 +00:00
[utils] sanitize_path
: Fix some incorrect behavior (#11923)
Authored by: Grub4K
This commit is contained in:
parent
61ae5dc34a
commit
fc12e724a3
@ -249,17 +249,36 @@ def _test_sanitize_path(self):
|
|||||||
self.assertEqual(sanitize_path('abc/def...'), 'abc\\def..#')
|
self.assertEqual(sanitize_path('abc/def...'), 'abc\\def..#')
|
||||||
self.assertEqual(sanitize_path('abc.../def'), 'abc..#\\def')
|
self.assertEqual(sanitize_path('abc.../def'), 'abc..#\\def')
|
||||||
self.assertEqual(sanitize_path('abc.../def...'), 'abc..#\\def..#')
|
self.assertEqual(sanitize_path('abc.../def...'), 'abc..#\\def..#')
|
||||||
|
|
||||||
self.assertEqual(sanitize_path('../abc'), '..\\abc')
|
|
||||||
self.assertEqual(sanitize_path('../../abc'), '..\\..\\abc')
|
|
||||||
self.assertEqual(sanitize_path('./abc'), 'abc')
|
|
||||||
self.assertEqual(sanitize_path('./../abc'), '..\\abc')
|
|
||||||
|
|
||||||
self.assertEqual(sanitize_path('\\abc'), '\\abc')
|
|
||||||
self.assertEqual(sanitize_path('C:abc'), 'C:abc')
|
|
||||||
self.assertEqual(sanitize_path('C:abc\\..\\'), 'C:..')
|
|
||||||
self.assertEqual(sanitize_path('C:\\abc:%(title)s.%(ext)s'), 'C:\\abc#%(title)s.%(ext)s')
|
self.assertEqual(sanitize_path('C:\\abc:%(title)s.%(ext)s'), 'C:\\abc#%(title)s.%(ext)s')
|
||||||
|
|
||||||
|
# Check with nt._path_normpath if available
|
||||||
|
try:
|
||||||
|
import nt
|
||||||
|
|
||||||
|
nt_path_normpath = getattr(nt, '_path_normpath', None)
|
||||||
|
except Exception:
|
||||||
|
nt_path_normpath = None
|
||||||
|
|
||||||
|
for test, expected in [
|
||||||
|
('C:\\', 'C:\\'),
|
||||||
|
('../abc', '..\\abc'),
|
||||||
|
('../../abc', '..\\..\\abc'),
|
||||||
|
('./abc', 'abc'),
|
||||||
|
('./../abc', '..\\abc'),
|
||||||
|
('\\abc', '\\abc'),
|
||||||
|
('C:abc', 'C:abc'),
|
||||||
|
('C:abc\\..\\', 'C:'),
|
||||||
|
('C:abc\\..\\def\\..\\..\\', 'C:..'),
|
||||||
|
('C:\\abc\\xyz///..\\def\\', 'C:\\abc\\def'),
|
||||||
|
('abc/../', '.'),
|
||||||
|
('./abc/../', '.'),
|
||||||
|
]:
|
||||||
|
result = sanitize_path(test)
|
||||||
|
assert result == expected, f'{test} was incorrectly resolved'
|
||||||
|
assert result == sanitize_path(result), f'{test} changed after sanitizing again'
|
||||||
|
if nt_path_normpath:
|
||||||
|
assert result == nt_path_normpath(test), f'{test} does not match nt._path_normpath'
|
||||||
|
|
||||||
def test_sanitize_url(self):
|
def test_sanitize_url(self):
|
||||||
self.assertEqual(sanitize_url('//foo.bar'), 'http://foo.bar')
|
self.assertEqual(sanitize_url('//foo.bar'), 'http://foo.bar')
|
||||||
self.assertEqual(sanitize_url('httpss://foo.bar'), 'https://foo.bar')
|
self.assertEqual(sanitize_url('httpss://foo.bar'), 'https://foo.bar')
|
||||||
|
@ -685,7 +685,8 @@ def _sanitize_path_parts(parts):
|
|||||||
elif part == '..':
|
elif part == '..':
|
||||||
if sanitized_parts and sanitized_parts[-1] != '..':
|
if sanitized_parts and sanitized_parts[-1] != '..':
|
||||||
sanitized_parts.pop()
|
sanitized_parts.pop()
|
||||||
sanitized_parts.append('..')
|
else:
|
||||||
|
sanitized_parts.append('..')
|
||||||
continue
|
continue
|
||||||
# Replace invalid segments with `#`
|
# Replace invalid segments with `#`
|
||||||
# - trailing dots and spaces (`asdf...` => `asdf..#`)
|
# - trailing dots and spaces (`asdf...` => `asdf..#`)
|
||||||
@ -702,7 +703,8 @@ def sanitize_path(s, force=False):
|
|||||||
if not force:
|
if not force:
|
||||||
return s
|
return s
|
||||||
root = '/' if s.startswith('/') else ''
|
root = '/' if s.startswith('/') else ''
|
||||||
return root + '/'.join(_sanitize_path_parts(s.split('/')))
|
path = '/'.join(_sanitize_path_parts(s.split('/')))
|
||||||
|
return root + path if root or path else '.'
|
||||||
|
|
||||||
normed = s.replace('/', '\\')
|
normed = s.replace('/', '\\')
|
||||||
|
|
||||||
@ -721,7 +723,8 @@ def sanitize_path(s, force=False):
|
|||||||
root = '\\' if normed[:1] == '\\' else ''
|
root = '\\' if normed[:1] == '\\' else ''
|
||||||
parts = normed.split('\\')
|
parts = normed.split('\\')
|
||||||
|
|
||||||
return root + '\\'.join(_sanitize_path_parts(parts))
|
path = '\\'.join(_sanitize_path_parts(parts))
|
||||||
|
return root + path if root or path else '.'
|
||||||
|
|
||||||
|
|
||||||
def sanitize_url(url, *, scheme='http'):
|
def sanitize_url(url, *, scheme='http'):
|
||||||
|
Loading…
Reference in New Issue
Block a user