[Python-checkins] cpython (2.7): fix behavior of trailing slash redirection when a query string is involved

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


https://hg.python.org/cpython/rev/b058a904c630
changeset: 93966:b058a904c630
branch: 2.7
parent: 93957:55462210ba2d
user: Benjamin Peterson <benjamin at python.org>
date: Fri Dec 26 10:53:43 2014 -0600
summary:
 fix behavior of trailing slash redirection when a query string is involved (closes #23112)
files:
 Lib/SimpleHTTPServer.py | 9 +++++++--
 Lib/test/test_httpservers.py | 6 ++++++
 Misc/NEWS | 3 +++
 3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/Lib/SimpleHTTPServer.py b/Lib/SimpleHTTPServer.py
--- a/Lib/SimpleHTTPServer.py
+++ b/Lib/SimpleHTTPServer.py
@@ -14,6 +14,7 @@
 import posixpath
 import BaseHTTPServer
 import urllib
+import urlparse
 import cgi
 import sys
 import shutil
@@ -68,10 +69,14 @@
 path = self.translate_path(self.path)
 f = None
 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
 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()
 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
@@ -321,6 +321,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
@@ -15,6 +15,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.
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /