]> granicus.if.org Git - python/commitdiff
Issue #23440: Improve http.server.SimpleHTTPRequestHandler tests
authorBerker Peksag <berker.peksag@gmail.com>
Wed, 22 Jul 2015 16:25:37 +0000 (19:25 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Wed, 22 Jul 2015 16:25:37 +0000 (19:25 +0300)
* Tests that index.html is served, rather than an automatic directory listing
* Tests that there is no extra data sent after the response

Patch by Martin Panter.

Lib/test/test_httpservers.py

index fcdfe51d83740e74999da0e27fd57adabb35e0db..518e38ec3d11a89e33e3f56f3732715a7f1e21f8 100644 (file)
@@ -298,12 +298,28 @@ class SimpleHTTPServerTestCase(BaseTestCase):
             BaseTestCase.tearDown(self)
 
     def check_status_and_reason(self, response, status, data=None):
+        def close_conn():
+            """Don't close reader yet so we can check if there was leftover
+            buffered input"""
+            nonlocal reader
+            reader = response.fp
+            response.fp = None
+        reader = None
+        response._close_conn = close_conn
+
         body = response.read()
         self.assertTrue(response)
         self.assertEqual(response.status, status)
         self.assertIsNotNone(response.reason)
         if data:
             self.assertEqual(data, body)
+        # Ensure the server has not set up a persistent connection, and has
+        # not sent any extra data
+        self.assertEqual(response.version, 10)
+        self.assertEqual(response.msg.get("Connection", "close"), "close")
+        self.assertEqual(reader.read(30), b'', 'Connection should be closed')
+
+        reader.close()
         return body
 
     @support.requires_mac_ver(10, 5)
@@ -353,15 +369,21 @@ class SimpleHTTPServerTestCase(BaseTestCase):
         self.check_status_and_reason(response, HTTPStatus.NOT_FOUND)
         response = self.request('/' + 'ThisDoesNotExist' + '/')
         self.check_status_and_reason(response, HTTPStatus.NOT_FOUND)
-        with open(os.path.join(self.tempdir_name, 'index.html'), 'w') as f:
-            response = self.request('/' + self.tempdir_name + '/')
-            self.check_status_and_reason(response, HTTPStatus.OK)
-            # chmod() doesn't work as expected on Windows, and filesystem
-            # permissions are ignored by root on Unix.
-            if os.name == 'posix' and os.geteuid() != 0:
-                os.chmod(self.tempdir, 0)
+
+        data = b"Dummy index file\r\n"
+        with open(os.path.join(self.tempdir_name, 'index.html'), 'wb') as f:
+            f.write(data)
+        response = self.request('/' + self.tempdir_name + '/')
+        self.check_status_and_reason(response, HTTPStatus.OK, data)
+
+        # chmod() doesn't work as expected on Windows, and filesystem
+        # permissions are ignored by root on Unix.
+        if os.name == 'posix' and os.geteuid() != 0:
+            os.chmod(self.tempdir, 0)
+            try:
                 response = self.request(self.tempdir_name + '/')
                 self.check_status_and_reason(response, HTTPStatus.NOT_FOUND)
+            finally:
                 os.chmod(self.tempdir, 0o755)
 
     def test_head(self):