mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #22165: SimpleHTTPRequestHandler now supports undecodable file names.
This commit is contained in:
parent
402df0975c
commit
cb5bc408ad
3 changed files with 36 additions and 4 deletions
|
@ -747,7 +747,12 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
|
|||
return None
|
||||
list.sort(key=lambda a: a.lower())
|
||||
r = []
|
||||
displaypath = html.escape(urllib.parse.unquote(self.path))
|
||||
try:
|
||||
displaypath = urllib.parse.unquote(self.path,
|
||||
errors='surrogatepass')
|
||||
except UnicodeDecodeError:
|
||||
displaypath = urllib.parse.unquote(path)
|
||||
displaypath = html.escape(displaypath)
|
||||
enc = sys.getfilesystemencoding()
|
||||
title = 'Directory listing for %s' % displaypath
|
||||
r.append('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
|
||||
|
@ -769,9 +774,11 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
|
|||
displayname = name + "@"
|
||||
# Note: a link to a directory displays with @ and links with /
|
||||
r.append('<li><a href="%s">%s</a></li>'
|
||||
% (urllib.parse.quote(linkname), html.escape(displayname)))
|
||||
% (urllib.parse.quote(linkname,
|
||||
errors='surrogatepass'),
|
||||
html.escape(displayname)))
|
||||
r.append('</ul>\n<hr>\n</body>\n</html>\n')
|
||||
encoded = '\n'.join(r).encode(enc)
|
||||
encoded = '\n'.join(r).encode(enc, 'surrogateescape')
|
||||
f = io.BytesIO()
|
||||
f.write(encoded)
|
||||
f.seek(0)
|
||||
|
@ -794,7 +801,11 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
|
|||
path = path.split('#',1)[0]
|
||||
# Don't forget explicit trailing slash when normalizing. Issue17324
|
||||
trailing_slash = path.rstrip().endswith('/')
|
||||
path = posixpath.normpath(urllib.parse.unquote(path))
|
||||
try:
|
||||
path = urllib.parse.unquote(path, errors='surrogatepass')
|
||||
except UnicodeDecodeError:
|
||||
path = urllib.parse.unquote(path)
|
||||
path = posixpath.normpath(path)
|
||||
words = path.split('/')
|
||||
words = filter(None, words)
|
||||
path = os.getcwd()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue