Fix SimpleHTTPServer's request handling case on trailing '/'.

Patch contributed by Vajrasky Kok. Addresses Issue #17324
This commit is contained in:
Senthil Kumaran 2013-09-13 00:18:55 -07:00
parent b06f536cb7
commit d4fac04fde
3 changed files with 10 additions and 0 deletions

View File

@ -149,6 +149,8 @@ class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# abandon query parameters # abandon query parameters
path = path.split('?',1)[0] path = path.split('?',1)[0]
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.unquote(path)) path = posixpath.normpath(urllib.unquote(path))
words = path.split('/') words = path.split('/')
words = filter(None, words) words = filter(None, words)
@ -158,6 +160,8 @@ class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
head, word = os.path.split(word) head, word = os.path.split(word)
if word in (os.curdir, os.pardir): continue if word in (os.curdir, os.pardir): continue
path = os.path.join(path, word) path = os.path.join(path, word)
if trailing_slash:
path += '/'
return path return path
def copyfile(self, source, outputfile): def copyfile(self, source, outputfile):

View File

@ -313,6 +313,9 @@ class SimpleHTTPServerTestCase(BaseTestCase):
#constructs the path relative to the root directory of the HTTPServer #constructs the path relative to the root directory of the HTTPServer
response = self.request(self.tempdir_name + '/test') response = self.request(self.tempdir_name + '/test')
self.check_status_and_reason(response, 200, data=self.data) 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 + '/') response = self.request(self.tempdir_name + '/')
self.check_status_and_reason(response, 200) self.check_status_and_reason(response, 200)
response = self.request(self.tempdir_name) response = self.request(self.tempdir_name)

View File

@ -32,6 +32,9 @@ Core and Builtins
Library 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, - Issue #18784: The uuid module no more attempts to load libc via ctypes.CDLL,
if all necessary functions are already found in libuuid. if all necessary functions are already found in libuuid.
Patch by Evgeny Sologubov. Patch by Evgeny Sologubov.