fix behavior of trailing slash redirection when a query string is involved (closes #23112)

This commit is contained in:
Benjamin Peterson 2014-12-26 10:53:43 -06:00
parent cb36d247a7
commit a71cfc5cf3
3 changed files with 16 additions and 2 deletions

View File

@ -14,6 +14,7 @@ import os
import posixpath import posixpath
import BaseHTTPServer import BaseHTTPServer
import urllib import urllib
import urlparse
import cgi import cgi
import sys import sys
import shutil import shutil
@ -68,10 +69,14 @@ class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
path = self.translate_path(self.path) path = self.translate_path(self.path)
f = None f = None
if os.path.isdir(path): if os.path.isdir(path):
if not self.path.endswith('/'): parts = urlparse.urlsplit(self.path)
if not parts.path.endswith('/'):
# redirect browser - doing basically what apache does # redirect browser - doing basically what apache does
self.send_response(301) self.send_response(301)
self.send_header("Location", self.path + "/") new_parts = (parts[0], parts[1], parts[2] + '/',
parts[3], parts[4])
new_url = urlparse.urlunsplit(new_parts)
self.send_header("Location", new_url)
self.end_headers() self.end_headers()
return None return None
for index in "index.html", "index.htm": for index in "index.html", "index.htm":

View File

@ -321,6 +321,12 @@ class SimpleHTTPServerTestCase(BaseTestCase):
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)
self.check_status_and_reason(response, 301) self.check_status_and_reason(response, 301)
response = self.request(self.tempdir_name + '/?hi=2')
self.check_status_and_reason(response, 200)
response = self.request(self.tempdir_name + '?hi=1')
self.check_status_and_reason(response, 301)
self.assertEqual(response.getheader("Location"),
self.tempdir_name + "/?hi=1")
response = self.request('/ThisDoesNotExist') response = self.request('/ThisDoesNotExist')
self.check_status_and_reason(response, 404) self.check_status_and_reason(response, 404)
response = self.request('/' + 'ThisDoesNotExist' + '/') response = self.request('/' + 'ThisDoesNotExist' + '/')

View File

@ -15,6 +15,9 @@ Core and Builtins
Library Library
------- -------
- Issue #23112: Fix SimpleHTTPServer to correctly carry the query string and
fragment when it redirects to add a trailing slash.
- Issue #23093: In the io, module allow more operations to work on detached - Issue #23093: In the io, module allow more operations to work on detached
streams. streams.