[Python-checkins] cpython (merge 3.4 -> default): merge 3.4 (#23112)

benjamin.peterson python-checkins at python.org
Fri Dec 26 17:57:09 CET 2014


https://hg.python.org/cpython/rev/e7c7e1fce3e2
changeset:   93968:e7c7e1fce3e2
parent:      93965:32c5b9aeee82
parent:      93967:3d19f419cc44
user:        Benjamin Peterson <benjamin at python.org>
date:        Fri Dec 26 10:56:51 2014 -0600
summary:
  merge 3.4 (#23112)

files:
  Lib/http/server.py           |  8 ++++++--
  Lib/test/test_httpservers.py |  6 ++++++
  Misc/NEWS                    |  3 +++
  3 files changed, 15 insertions(+), 2 deletions(-)


diff --git a/Lib/http/server.py b/Lib/http/server.py
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -648,10 +648,14 @@
         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
--- a/Lib/test/test_httpservers.py
+++ b/Lib/test/test_httpservers.py
@@ -305,6 +305,12 @@
         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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -196,6 +196,9 @@
 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.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list