summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Rosen <sirosen@globus.org>2021-05-06 19:25:52 (GMT)
committerGitHub <noreply@github.com>2021-05-06 19:25:52 (GMT)
commitfb427255614fc1f740e7785554c1da8ca39116c2 (patch)
tree00c72b2b79fc0a1fcd649a43e1780b5e13a78f97
parent329a47f0524e9d3f43f1e28c4f9e7c088662c030 (diff)
downloadcpython-fb427255614fc1f740e7785554c1da8ca39116c2.zip
cpython-fb427255614fc1f740e7785554c1da8ca39116c2.tar.gz
cpython-fb427255614fc1f740e7785554c1da8ca39116c2.tar.bz2
bpo-43972: Set content-length to 0 for http.server.SimpleHTTPRequestHandler 301s (GH-25705)
* Set content-length for simple http server 301s When http.server.SimpleHTTPRequestHandler sends a 301 (Moved Permanently) due to a missing file, it does not set a Content-Length of 0. Unfortunately, certain clients can be left waiting for the connection to be closed in this circumstance, even though no body will be sent. At time of writing, both curl and Firefox demonstrate this behavior. * Test Content-Length on simple http server redirect When serving a redirect, the SimpleHTTPRequestHandler will now send `Content-Length: 0`. Several tests for http.server already cover various behaviors and checks including redirection. This change only adds one check for the expected Content-Length on the simplest case for a redirect. * Add news entry for SimpleHTTPRequestHandler fix * Clarify the specific kind of 301 Co-authored-by: Senthil Kumaran <skumaran@gatech.edu>
-rw-r--r--Lib/http/server.py1
-rw-r--r--Lib/test/test_httpservers.py1
-rw-r--r--Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst3
3 files changed, 5 insertions, 0 deletions
diff --git a/Lib/http/server.py b/Lib/http/server.py
index 94f730e..e985dfd 100644
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -689,6 +689,7 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
parts[3], parts[4])
new_url = urllib.parse.urlunsplit(new_parts)
self.send_header("Location", new_url)
+ self.send_header("Content-Length", "0")
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 6b17817..cb0a3aa 100644
--- a/Lib/test/test_httpservers.py
+++ b/Lib/test/test_httpservers.py
@@ -428,6 +428,7 @@ class SimpleHTTPServerTestCase(BaseTestCase):
self.check_status_and_reason(response, HTTPStatus.OK)
response = self.request(self.base_url)
self.check_status_and_reason(response, HTTPStatus.MOVED_PERMANENTLY)
+ self.assertEqual(response.getheader("Content-Length"), "0")
response = self.request(self.base_url + '/?hi=2')
self.check_status_and_reason(response, HTTPStatus.OK)
response = self.request(self.base_url + '?hi=1')
diff --git a/Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst b/Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst
new file mode 100644
index 0000000..3d67b88
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst
@@ -0,0 +1,3 @@
+When :class:`http.server.SimpleHTTPRequestHandler` sends a
+``301 (Moved Permanently)`` for a directory path not ending with `/`, add a
+``Content-Length: 0`` header. This improves the behavior for certain clients.