summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSenthil Kumaran <senthil@uthcode.com>2013-09-13 07:22:45 (GMT)
committerSenthil Kumaran <senthil@uthcode.com>2013-09-13 07:22:45 (GMT)
commit187b06300518d35d04454238c240fdfd28864141 (patch)
tree58fd441d9468e0fc35a4d707c55f1c10b6d66656
parent5abf3d9926be2c84d80e4c2bc775f175521a8a38 (diff)
parent72c238e21ae78f8da969c46a2b7317ff9904d155 (diff)
downloadcpython-187b06300518d35d04454238c240fdfd28864141.zip
cpython-187b06300518d35d04454238c240fdfd28864141.tar.gz
cpython-187b06300518d35d04454238c240fdfd28864141.tar.bz2
Fix http.server's request handling case on trailing '/'.
Patch contributed by Vajrasky Kok. Addresses Issue #17324
-rw-r--r--Lib/http/server.py4
-rw-r--r--Lib/test/test_httpservers.py3
-rw-r--r--Misc/NEWS4
3 files changed, 11 insertions, 0 deletions
diff --git a/Lib/http/server.py b/Lib/http/server.py
index e47e034..87d8378 100644
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -788,6 +788,8 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
# abandon query parameters
path = path.split('?',1)[0]
path = path.split('#',1)[0]
+ # Don't forget explicit trailing slash when normalizing. Issue17324
+ trailing_slash = True if path.rstrip().endswith('/') else False
path = posixpath.normpath(urllib.parse.unquote(path))
words = path.split('/')
words = filter(None, words)
@@ -797,6 +799,8 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
head, word = os.path.split(word)
if word in (os.curdir, os.pardir): continue
path = os.path.join(path, word)
+ if trailing_slash:
+ path += '/'
return path
def copyfile(self, source, outputfile):
diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
index ec751cc..4083afc 100644
--- a/Lib/test/test_httpservers.py
+++ b/Lib/test/test_httpservers.py
@@ -270,6 +270,9 @@ class SimpleHTTPServerTestCase(BaseTestCase):
#constructs the path relative to the root directory of the HTTPServer
response = self.request(self.tempdir_name + '/test')
self.check_status_and_reason(response, 200, data=self.data)
+ # check for trailing "/" which should return 404. See Issue17324
+ response = self.request(self.tempdir_name + '/test/')
+ self.check_status_and_reason(response, 404)
response = self.request(self.tempdir_name + '/')
self.check_status_and_reason(response, 200)
response = self.request(self.tempdir_name)
diff --git a/Misc/NEWS b/Misc/NEWS
index 556dca2..9f6871a 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@ Core and Builtins
Library
-------
+
+- Issue #17324: Fix http.server's request handling case on trailing '/'. Patch
+ contributed by Vajrasky Kok.
+
- Issue #18784: The uuid module no more attempts to load libc via ctypes.CDLL,
if all necessary functions are already found in libuuid.
Patch by Evgeny Sologubov.