@@ -28,6 +28,8 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
2828 self ._did_handshake : bool = False
2929 self ._sent_non_empty_bytes : bool = False
3030 self ._has_written : bool = False
31+ self ._ssl_pending : bytes = b""
32+ self ._ssl_pending_pos : int = 0
3133 self ._original_socket : MocketSocket = self
3234
3335 def read (self , buffersize : int | None = None ) -> bytes :
@@ -40,7 +42,16 @@ def read(self, buffersize: int | None = None) -> bytes:
4042 Bytes read from the socket
4143
4244 """
43- rv = self .io .read (buffersize )
45+ if self ._ssl_pending_pos < len (self ._ssl_pending ):
46+ if buffersize is None :
47+ rv = self ._ssl_pending [self ._ssl_pending_pos :]
48+ self ._ssl_pending_pos = len (self ._ssl_pending )
49+ else :
50+ end = self ._ssl_pending_pos + buffersize
51+ rv = self ._ssl_pending [self ._ssl_pending_pos : end ]
52+ self ._ssl_pending_pos = min (end , len (self ._ssl_pending ))
53+ else :
54+ rv = b""
4455 if rv :
4556 self ._sent_non_empty_bytes = True
4657
@@ -65,7 +76,13 @@ def write(self, data: bytes) -> int | None:
6576 Number of bytes written
6677 """
6778 self ._has_written = self ._has_written or bool (data )
68- return self .send (encode_to_bytes (data ))
79+ bytes_sent = self .send (encode_to_bytes (data ))
80+
81+ # Keep a private read buffer for SSL protocol consumers so response
82+ # parsing does not depend on shared socket I/O cursor state.
83+ self ._ssl_pending = self .io .getvalue ()
84+ self ._ssl_pending_pos = 0
85+ return bytes_sent
6986
7087 def do_handshake (self ) -> None :
7188 """Perform SSL handshake (mock implementation)."""
@@ -165,5 +182,7 @@ def _create(
165182 ssl_socket ._io = sock ._io
166183 ssl_socket ._entry = sock ._entry
167184 ssl_socket ._has_written = getattr (sock , "_has_written" , False )
185+ ssl_socket ._ssl_pending = getattr (sock , "_ssl_pending" , b"" )
186+ ssl_socket ._ssl_pending_pos = getattr (sock , "_ssl_pending_pos" , 0 )
168187
169188 return ssl_socket
0 commit comments