]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
BaseIOStream.write(): support typed memoryview 2996/head
authorMads R. B. Kristensen <madsbk@gmail.com>
Tue, 2 Mar 2021 09:52:29 +0000 (10:52 +0100)
committerMads R. B. Kristensen <madsbk@gmail.com>
Tue, 2 Mar 2021 09:52:29 +0000 (10:52 +0100)
Making sure that ``len(data) == data.nbytes`` by casting
memoryviews to bytes.

tornado/iostream.py
tornado/test/iostream_test.py

index 7610bce4fa0acc1c21357570aa70902db52cb36c..86235f4dc34f6651e0351b8d7a1015164e9d0cd3 100644 (file)
@@ -529,6 +529,9 @@ class BaseIOStream(object):
         """
         self._check_closed()
         if data:
+            if isinstance(data, memoryview):
+                # Make sure that ``len(data) == data.nbytes``
+                data = memoryview(data).cast("B")
             if (
                 self.max_write_buffer_size is not None
                 and len(self._write_buffer) + len(data) > self.max_write_buffer_size
index a43aa64cad3cf6af21b64fb4a576d998cbd5c675..797a2dfc1383ab080263597f2bf97e7b4b85679d 100644 (file)
@@ -1047,6 +1047,17 @@ class TestIOStreamStartTLS(AsyncTestCase):
                 # The server fails to connect, but the exact error is unspecified.
                 yield server_future
 
+    @gen_test
+    def test_typed_memoryview(self):
+        # Test support of memoryviews with an item size greater than 1 byte.
+        buf = memoryview(bytes(80)).cast("L")
+        assert self.server_stream is not None
+        yield self.server_stream.write(buf)
+        assert self.client_stream is not None
+        # This will timeout if the calculation of the buffer size is incorrect
+        recv = yield self.client_stream.read_bytes(buf.nbytes)
+        self.assertEqual(bytes(recv), bytes(buf))
+
 
 class WaitForHandshakeTest(AsyncTestCase):
     @gen.coroutine