Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
41a08e55
Commit
41a08e55
authored
Aug 17, 2014
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #22165: SimpleHTTPRequestHandler now supports undecodable file names.
parents
f9e227e5
cb5bc408
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
36 additions
and
4 deletions
+36
-4
Lib/http/server.py
Lib/http/server.py
+15
-4
Lib/test/test_httpservers.py
Lib/test/test_httpservers.py
+19
-0
Misc/NEWS
Misc/NEWS
+2
-0
No files found.
Lib/http/server.py
View file @
41a08e55
...
...
@@ -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
()
...
...
Lib/test/test_httpservers.py
View file @
41a08e55
...
...
@@ -14,6 +14,7 @@ import re
import
base64
import
shutil
import
urllib.parse
import
html
import
http.client
import
tempfile
from
io
import
BytesIO
...
...
@@ -266,6 +267,24 @@ class SimpleHTTPServerTestCase(BaseTestCase):
self
.
assertIsNotNone
(
response
.
reason
)
if
data
:
self
.
assertEqual
(
data
,
body
)
return
body
@
unittest
.
skipUnless
(
support
.
TESTFN_UNDECODABLE
,
'need support.TESTFN_UNDECODABLE'
)
def
test_undecodable_filename
(
self
):
filename
=
os
.
fsdecode
(
support
.
TESTFN_UNDECODABLE
)
+
'.txt'
with
open
(
os
.
path
.
join
(
self
.
tempdir
,
filename
),
'wb'
)
as
f
:
f
.
write
(
support
.
TESTFN_UNDECODABLE
)
response
=
self
.
request
(
self
.
tempdir_name
+
'/'
)
body
=
self
.
check_status_and_reason
(
response
,
200
)
quotedname
=
urllib
.
parse
.
quote
(
filename
,
errors
=
'surrogatepass'
)
self
.
assertIn
((
'href="%s"'
%
quotedname
)
.
encode
(
'utf-8'
,
'surrogateescape'
),
body
)
self
.
assertIn
((
'>%s<'
%
html
.
escape
(
filename
))
.
encode
(
'utf-8'
,
'surrogateescape'
),
body
)
response
=
self
.
request
(
self
.
tempdir_name
+
'/'
+
quotedname
)
self
.
check_status_and_reason
(
response
,
200
,
data
=
support
.
TESTFN_UNDECODABLE
)
def
test_get
(
self
):
#constructs the path relative to the root directory of the HTTPServer
...
...
Misc/NEWS
View file @
41a08e55
...
...
@@ -118,6 +118,8 @@ Core and Builtins
Library
-------
-
Issue
#
22165
:
SimpleHTTPRequestHandler
now
supports
undecodable
file
names
.
-
Issue
#
15381
:
Optimized
line
reading
in
io
.
BytesIO
.
-
Issue
#
20729
:
Restored
the
use
of
lazy
iterkeys
()/
itervalues
()/
iteritems
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment