]> granicus.if.org Git - python/commitdiff
Issue #21069: Move test_fileno() from test_urllibnet and rewrite it
authorMartin Panter <vadmium+py@gmail.com>
Sat, 9 Apr 2016 14:03:17 +0000 (14:03 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Sat, 9 Apr 2016 14:03:17 +0000 (14:03 +0000)
* No longer attempts to close already freed socket file descriptor
* Use socket object to be compatible with Windows
* Do not use a timeout to avoid complication with non-blocking mode
* Use internal localhost server rather than depending on a third party
* Avoid trouble with buffered HTTP data by testing tunnelled CONNECT data

Lib/test/test_httplib.py
Lib/test/test_urllibnet.py

index 6d2ed39ee9c6d2bc43ff58768e2627918d56b80b..7d997b087def578fcf049483c2c287c2c57f2bd9 100644 (file)
@@ -915,6 +915,47 @@ class BasicTest(TestCase):
         self.assertEqual(sock.file.read(), extradata) #we read to the end
         resp.close()
 
+    def test_response_fileno(self):
+        # Make sure fd returned by fileno is valid.
+        threading = support.import_module("threading")
+
+        serv = socket.socket(
+            socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
+        self.addCleanup(serv.close)
+        serv.bind((HOST, 0))
+        serv.listen()
+
+        result = None
+        def run_server():
+            [conn, address] = serv.accept()
+            with conn, conn.makefile("rb") as reader:
+                # Read the request header until a blank line
+                while True:
+                    line = reader.readline()
+                    if not line.rstrip(b"\r\n"):
+                        break
+                conn.sendall(b"HTTP/1.1 200 Connection established\r\n\r\n")
+                nonlocal result
+                result = reader.read()
+
+        thread = threading.Thread(target=run_server)
+        thread.start()
+        conn = client.HTTPConnection(*serv.getsockname())
+        conn.request("CONNECT", "dummy:1234")
+        response = conn.getresponse()
+        try:
+            self.assertEqual(response.status, client.OK)
+            s = socket.socket(fileno=response.fileno())
+            try:
+                s.sendall(b"proxied data\n")
+            finally:
+                s.detach()
+        finally:
+            response.close()
+            conn.close()
+            thread.join()
+        self.assertEqual(result, b"proxied data\n")
+
 class ExtendedReadTest(TestCase):
     """
     Test peek(), read1(), readline()
index d5110a633f4334dec14156fb07daf02ffcd7617d..f6df54e3b7199a78beb05ad7ddf076f43216fe30 100644 (file)
@@ -99,17 +99,6 @@ class urlopenNetworkTests(unittest.TestCase):
                 open_url.close()
             self.assertEqual(code, 404)
 
-    # On Windows, socket handles are not file descriptors; this
-    # test can't pass on Windows.
-    @unittest.skipIf(sys.platform in ('win32',), 'not appropriate for Windows')
-    def test_fileno(self):
-        # Make sure fd returned by fileno is valid.
-        with self.urlopen("http://www.google.com/") as open_url:
-            fd = open_url.fileno()
-            with os.fdopen(fd, 'rb') as f:
-                self.assertTrue(f.read(), "reading from file created using fd "
-                                          "returned by fileno failed")
-
     def test_bad_address(self):
         # Make sure proper exception is raised when connecting to a bogus
         # address.