Skip to content

Commit

Permalink
Read from wrapped stream if the SSLObject doesn't have data in its bu…
Browse files Browse the repository at this point in the history
…ffer
  • Loading branch information
agronholm committed Jul 11, 2023
1 parent 8b90809 commit c052c38
Showing 1 changed file with 32 additions and 4 deletions.
36 changes: 32 additions & 4 deletions src/anyio/streams/tls.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,10 +196,38 @@ async def aclose(self) -> None:
await self.transport_stream.aclose()

def receive_nowait(self, max_bytes: int = 65536) -> bytes:
try:
data = self._ssl_object.read(max_bytes)
except (ssl.SSLWantReadError, ssl.SSLWantWriteError):
raise WouldBlock from None
while True:
try:
data = self._ssl_object.read(max_bytes)
break
except ssl.SSLWantReadError:
try:
data = self.transport_stream.receive_nowait()
except WouldBlock:
raise WouldBlock from None
except EndOfStream:
self._read_bio.write_eof()
except OSError as exc:
self._read_bio.write_eof()
self._write_bio.write_eof()
raise BrokenResourceError from exc
else:
self._read_bio.write(data)
except ssl.SSLWantWriteError:
raise WouldBlock from None
except ssl.SSLError as exc:
self._read_bio.write_eof()
self._write_bio.write_eof()
if (
isinstance(exc, ssl.SSLEOFError)
or "UNEXPECTED_EOF_WHILE_READING" in exc.strerror
):
if self.standard_compatible:
raise BrokenResourceError from exc
else:
raise EndOfStream from None

raise

if not data:
raise EndOfStream
Expand Down

0 comments on commit c052c38

Please sign in to comment.