]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43972: Set content-length to 0 for http.server.SimpleHTTPRequestHandler 301s...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 6 May 2021 19:50:54 +0000 (12:50 -0700)
committerGitHub <noreply@github.com>
Thu, 6 May 2021 19:50:54 +0000 (12:50 -0700)
* 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>
(cherry picked from commit fb427255614fc1f740e7785554c1da8ca39116c2)

Co-authored-by: Stephen Rosen <sirosen@globus.org>
Lib/http/server.py
Lib/test/test_httpservers.py
Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst [new file with mode: 0644]

index def05f46be4f9118880aa17697653e73b8c264da..d7cce20432ead4b8497d7658117b175f49791427 100644 (file)
@@ -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":
index 8df0b5251f1ae3b6601d3a0d9ba2c7a4ac45c535..b33fedaafc5a0020a4631ff686ca106777e33fd7 100644 (file)
@@ -426,6 +426,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 (file)
index 0000000..3d67b88
--- /dev/null
@@ -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.