]> granicus.if.org Git - python/commitdiff
Issue #16088: BaseHTTPRequestHandler's send_error method includes a
authorSenthil Kumaran <senthil@uthcode.com>
Thu, 11 Oct 2012 06:16:21 +0000 (23:16 -0700)
committerSenthil Kumaran <senthil@uthcode.com>
Thu, 11 Oct 2012 06:16:21 +0000 (23:16 -0700)
Content-Length header.  Patch by Antoine Pitrou.

Doc/library/http.server.rst
Lib/http/server.py
Lib/test/test_httpservers.py
Misc/NEWS

index cbad3ed36105750e7b4d03908a1f5dd16ff67a6b..0577d5e9fdd0c4934d35c92f1055c8ae5780e22c 100644 (file)
@@ -177,6 +177,9 @@ of which this module provides three different variants:
       complete set of headers is sent, followed by text composed using the
       :attr:`error_message_format` class variable.
 
+      .. versionchanged:: 3.4
+         The error response includes a Content-Length header.
+
    .. method:: send_response(code, message=None)
 
       Adds a response header to the headers buffer and logs the accepted
index c4ac703d2daf0f6cc4ef1b945219ed7c614492d6..7167142084c2fc25b149ba6b0a4948800254f88d 100644 (file)
@@ -425,12 +425,14 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
         # using _quote_html to prevent Cross Site Scripting attacks (see bug #1100201)
         content = (self.error_message_format %
                    {'code': code, 'message': _quote_html(message), 'explain': explain})
+        body = content.encode('UTF-8', 'replace')
         self.send_response(code, message)
         self.send_header("Content-Type", self.error_content_type)
         self.send_header('Connection', 'close')
+        self.send_header('Content-Length', int(len(body)))
         self.end_headers()
         if self.command != 'HEAD' and code >= 200 and code not in (204, 304):
-            self.wfile.write(content.encode('UTF-8', 'replace'))
+            self.wfile.write(body)
 
     def send_response(self, code, message=None):
         """Add the response header to the headers buffer and log the
index 75133c9379f3c0575d26eb1a8e8fce95172de5fb..64640f53ac4dbf0e5babd716ad10fc951e6870cb 100644 (file)
@@ -92,6 +92,9 @@ class BaseHTTPServerTestCase(BaseTestCase):
         def do_KEYERROR(self):
             self.send_error(999)
 
+        def do_NOTFOUND(self):
+            self.send_error(404)
+
         def do_CUSTOM(self):
             self.send_response(999)
             self.send_header('Content-Type', 'text/html')
@@ -211,6 +214,15 @@ class BaseHTTPServerTestCase(BaseTestCase):
         self.assertEqual(res.getheader('X-Special'), 'Dängerous Mind')
         self.assertEqual(res.read(), 'Ärger mit Unicode'.encode('utf-8'))
 
+    def test_error_content_length(self):
+        # Issue #16088: standard error responses should have a content-length
+        self.con.request('NOTFOUND', '/')
+        res = self.con.getresponse()
+        self.assertEqual(res.status, 404)
+        data = res.read()
+        import pdb; pdb.set_trace()
+        self.assertEqual(int(res.getheader('Content-Length')), len(data))
+
 
 class SimpleHTTPServerTestCase(BaseTestCase):
     class request_handler(NoLogRequestHandler, SimpleHTTPRequestHandler):
index 0215e2d746422f21c95f54ae3cc777d0229ec2f5..63c62b9d24c64163ec313989882f00a136407ca4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -45,6 +45,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #16088: BaseHTTPRequestHandler's send_error method includes a
+  Content-Length header in it's response now. Patch by Antoine Pitrou.
+
 - Issue #16114: The subprocess module no longer provides a misleading error
   message stating that args[0] did not exist when either the cwd or executable
   keyword arguments specified a path that did not exist.