summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2014-12-26 16:56:51 (GMT)
committerBenjamin Peterson <benjamin@python.org>2014-12-26 16:56:51 (GMT)
commitfe975a234fec6fa9c88b1d90d97542398267a484 (patch)
tree01be79ca7375ecf8a69670fce02581f5ac4f63ce
parentf2ad173eaf38140bd72a849f47e0427b3d941692 (diff)
parent94cb7a24298ee0a4d6a3bb6b8ae80a7729e9f788 (diff)
downloadcpython-fe975a234fec6fa9c88b1d90d97542398267a484.zip
cpython-fe975a234fec6fa9c88b1d90d97542398267a484.tar.gz
cpython-fe975a234fec6fa9c88b1d90d97542398267a484.tar.bz2
merge 3.4 (#23112)
-rw-r--r--Lib/http/server.py8
-rw-r--r--Lib/test/test_httpservers.py6
-rw-r--r--Misc/NEWS3
3 files changed, 15 insertions, 2 deletions
diff --git a/Lib/http/server.py b/Lib/http/server.py
index 02e9cc2..ac53550 100644
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -648,10 +648,14 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
path = self.translate_path(self.path)
f = None
if os.path.isdir(path):
- if not self.path.endswith('/'):
+ parts = urllib.parse.urlsplit(self.path)
+ if not parts.path.endswith('/'):
# redirect browser - doing basically what apache does
self.send_response(HTTPStatus.MOVED_PERMANENTLY)
- self.send_header("Location", self.path + "/")
+ new_parts = (parts[0], parts[1], parts[2] + '/',
+ parts[3], parts[4])
+ new_url = urllib.parse.urlunsplit(new_parts)
+ self.send_header("Location", new_url)
self.end_headers()
return None
for index in "index.html", "index.htm":
diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
index 97713cd..a31db5b 100644
--- a/Lib/test/test_httpservers.py
+++ b/Lib/test/test_httpservers.py
@@ -305,6 +305,12 @@ class SimpleHTTPServerTestCase(BaseTestCase):
self.check_status_and_reason(response, 200)
response = self.request(self.tempdir_name)
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')
self.check_status_and_reason(response, 404)
response = self.request('/' + 'ThisDoesNotExist' + '/')
diff --git a/Misc/NEWS b/Misc/NEWS
index 97b329a..45dd5b4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -196,6 +196,9 @@ Core and Builtins
Library
-------
+- Issue #23112: Fix SimpleHTTPServer to correctly carry the query string and
+ fragment when it redirects to add a trailing slash.
+
- Issue #21793: Added http.HTTPStatus enums (i.e. HTTPStatus.OK,
HTTPStatus.NOT_FOUND). Patch by Demian Brecht.