28 lines
895 B
Python
28 lines
895 B
Python
import typing
|
|
|
|
import OpenSSL.SSL
|
|
|
|
|
|
class SendWrap:
|
|
def __init__(self, sock: OpenSSL.SSL.Connection):
|
|
self.__sock = sock
|
|
self.__cached_write = None # type: typing.Optional[typing.Tuple[bytes, typing.Any]] # noqa
|
|
|
|
def send(self, buf: typing.Union[bytes, memoryview]) -> int:
|
|
if self.__cached_write is not None:
|
|
as_bytes, prev_buf = self.__cached_write
|
|
if prev_buf is not buf:
|
|
raise ValueError(
|
|
"this looks like a mistake: the previous send received a "
|
|
"different buffer object"
|
|
)
|
|
self.__cached_write = None
|
|
else:
|
|
as_bytes = bytes(buf)
|
|
|
|
try:
|
|
return self.__sock.send(as_bytes)
|
|
except (OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantReadError):
|
|
self.__cached_write = as_bytes, buf
|
|
raise
|