]> granicus.if.org Git - python/commitdiff
fix behavior of trailing slash redirection when a query string is involved (closes...
authorBenjamin Peterson <benjamin@python.org>
Fri, 26 Dec 2014 16:53:43 +0000 (10:53 -0600)
committerBenjamin Peterson <benjamin@python.org>
Fri, 26 Dec 2014 16:53:43 +0000 (10:53 -0600)
Lib/SimpleHTTPServer.py
Lib/test/test_httpservers.py
Misc/NEWS

index d497e1e8cc797b9749bf74eab177ea2604dfe283..783d0ac270e88bd960886079212464aacaa9ca27 100644 (file)
@@ -14,6 +14,7 @@ import os
 import posixpath
 import BaseHTTPServer
 import urllib
+import urlparse
 import cgi
 import sys
 import shutil
@@ -68,10 +69,14 @@ class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         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":
index bd26140dce9c392bc0213bc811ecf9270806610c..706dfc7fb2ad289f3db66fe34c9bd503fd22031d 100644 (file)
@@ -321,6 +321,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' + '/')
index 8d44926168e3b7db08b610ded0473a79ac1e0ce3..b204aeb8aa4035308f7a41242abf9fe4c4417ed6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,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 #23093: In the io, module allow more operations to work on detached
   streams.