8000 [3.11] gh-84443: SSLSocket.recv_into() now support buffer protocol wi… · python/cpython@6d9b181 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6d9b181

Browse files
[3.11] gh-84443: SSLSocket.recv_into() now support buffer protocol with itemsize != 1 (GH-20310) (GH-112459)
It is also no longer use __len__(). (cherry picked from commit 812360f) Co-authored-by: Zackery Spytz <zspytz@gmail.com>
1 parent 62e430a commit 6d9b181

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

Lib/ssl.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,10 +1299,14 @@ def recv(self, buflen=1024, flags=0):
12991299

13001300
def recv_into(self, buffer, nbytes=None, flags=0):
13011301
self._checkClosed()
1302-
if buffer and (nbytes is None):
1303-
nbytes = len(buffer)
1304-
elif nbytes is None:
1305-
nbytes = 1024
1302+
if nbytes is None:
1303+
if buffer is not None:
1304+
with memoryview(buffer) as view:
1305+
nbytes = view.nbytes
1306+
if not nbytes:
1307+
nbytes = 1024
1308+
else:
1309+
nbytes = 1024
13061310
if self._sslobj is not None:
13071311
if flags != 0:
13081312
raise ValueError(

Lib/test/test_ssl.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from test.support import socket_helper
1010
from test.support import threading_helper
1111
from test.support import warnings_helper
12+
import array
1213
import re
1314
import socket
1415
import select
@@ -3765,6 +3766,27 @@ def test_recv_zero(self):
37653766
self.assertEqual(s.recv(0), b"")
37663767
self.assertEqual(s.recv_into(bytearray()), 0)
37673768

3769+
def test_recv_into_buffer_protocol_len(self):
3770+
server = ThreadedEchoServer(CERTFILE)
3771+
self.enterContext(server)
3772+
s = socket.create_connection((HOST, server.port))
3773+
self.addCleanup(s.close)
3774+
s = test_wrap_socket(s, suppress_ragged_eofs=False)
3775+
self.addCleanup(s.close)
3776+
3777+
s.send(b"data")
3778+
buf = array.array('I', [0, 0])
3779+
self.assertEqual(s.recv_into(buf), 4)
3780+
self.assertEqual(bytes(buf)[:4], b"data")
3781+
3782+
class B(bytearray):
3783+
def __len__(self):
3784+
1/0
3785+
s.send(b"data")
3786+
buf = B(6)
3787+
self.assertEqual(s.recv_into(buf), 4)
3788+
self.assertEqual(bytes(buf), b"data\0\0")
3789+
37683790
def test_nonblocking_send(self):
37693791
server = ThreadedEchoServer(CERTFILE,
37703792
certreqs=ssl.CERT_NONE,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The :meth:`ssl.SSLSocket.recv_into` method no longer requires the *buffer*
2+
argument to implement ``__len__`` and supports buffers with arbitrary item size.

0 commit comments

Comments
 (0)
0