summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/ssl.py12
-rw-r--r--Lib/test/test_ssl.py22
-rw-r--r--Misc/NEWS.d/next/Library/2020-05-21-23-32-46.bpo-40262.z4fQv1.rst2
3 files changed, 32 insertions, 4 deletions
diff --git a/Lib/ssl.py b/Lib/ssl.py
index 62e5585..36fca9d 100644
--- a/Lib/ssl.py
+++ b/Lib/ssl.py
@@ -1270,10 +1270,14 @@ class SSLSocket(socket):
def recv_into(self, buffer, nbytes=None, flags=0):
self._checkClosed()
- if buffer and (nbytes is None):
- nbytes = len(buffer)
- elif nbytes is None:
- nbytes = 1024
+ if nbytes is None:
+ if buffer is not None:
+ with memoryview(buffer) as view:
+ nbytes = view.nbytes
+ if not nbytes:
+ nbytes = 1024
+ else:
+ nbytes = 1024
if self._sslobj is not None:
if flags != 0:
raise ValueError(
diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
index 9ade595..aecba89 100644
--- a/Lib/test/test_ssl.py
+++ b/Lib/test/test_ssl.py
@@ -10,6 +10,7 @@ from test.support import socket_helper
from test.support import threading_helper
from test.support import warnings_helper
from test.support import asyncore
+import array
import re
import socket
import select
@@ -3517,6 +3518,27 @@ class ThreadedTests(unittest.TestCase):
self.assertEqual(s.recv(0), b"")
self.assertEqual(s.recv_into(bytearray()), 0)
+ def test_recv_into_buffer_protocol_len(self):
+ server = ThreadedEchoServer(CERTFILE)
+ self.enterContext(server)
+ s = socket.create_connection((HOST, server.port))
+ self.addCleanup(s.close)
+ s = test_wrap_socket(s, suppress_ragged_eofs=False)
+ self.addCleanup(s.close)
+
+ s.send(b"data")
+ buf = array.array('I', [0, 0])
+ self.assertEqual(s.recv_into(buf), 4)
+ self.assertEqual(bytes(buf)[:4], b"data")
+
+ class B(bytearray):
+ def __len__(self):
+ 1/0
+ s.send(b"data")
+ buf = B(6)
+ self.assertEqual(s.recv_into(buf), 4)
+ self.assertEqual(bytes(buf), b"data\0\0")
+
def test_nonblocking_send(self):
server = ThreadedEchoServer(CERTFILE,
certreqs=ssl.CERT_NONE,
diff --git a/Misc/NEWS.d/next/Library/2020-05-21-23-32-46.bpo-40262.z4fQv1.rst b/Misc/NEWS.d/next/Library/2020-05-21-23-32-46.bpo-40262.z4fQv1.rst
new file mode 100644
index 0000000..c017a1c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-05-21-23-32-46.bpo-40262.z4fQv1.rst
@@ -0,0 +1,2 @@
+The :meth:`ssl.SSLSocket.recv_into` method no longer requires the *buffer*
+argument to implement ``__len__`` and supports buffers with arbitrary item size.