changeset: 93967:3d19f419cc44 branch: 3.4 parent: 93962:126aff7c6a33 user: Benjamin Peterson date: Fri Dec 26 10:53:43 2014 -0600 files: Lib/http/server.py Lib/test/test_httpservers.py Misc/NEWS description: fix behavior of trailing slash redirection when a query string is involved (closes #23112) diff -r 126aff7c6a33 -r 3d19f419cc44 Lib/http/server.py --- a/Lib/http/server.py Wed Dec 24 21:23:18 2014 -0500 +++ b/Lib/http/server.py Fri Dec 26 10:53:43 2014 -0600 @@ -701,10 +701,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(301) - 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 -r 126aff7c6a33 -r 3d19f419cc44 Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py Wed Dec 24 21:23:18 2014 -0500 +++ b/Lib/test/test_httpservers.py Fri Dec 26 10:53:43 2014 -0600 @@ -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 -r 126aff7c6a33 -r 3d19f419cc44 Misc/NEWS --- a/Misc/NEWS Wed Dec 24 21:23:18 2014 -0500 +++ b/Misc/NEWS Fri Dec 26 10:53:43 2014 -0600 @@ -41,6 +41,9 @@ 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 streams.