Skip to content

Commit be4bec6

Browse files
committed
PyMongoProtocol.read() returns a copy of the buffer
1 parent f3ebf92 commit be4bec6

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

pymongo/network_layer.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,6 @@ def settimeout(self, timeout: float | None) -> None:
419419
self.conn[1].settimeout(timeout)
420420

421421
async def close(self) -> None:
422-
# print(f"Closing network interface from {''.join(traceback.format_stack())}")
423422
self.conn[0].abort()
424423
await self.conn[1].wait_closed()
425424

@@ -516,7 +515,11 @@ async def write(self, message: bytes) -> None:
516515
async def read(self, request_id: Optional[int], max_message_size: int) -> tuple[bytes, int]:
517516
"""Read a single MongoDB Wire Protocol message from this connection."""
518517
if self.transport:
519-
self.transport.resume_reading()
518+
try:
519+
self.transport.resume_reading()
520+
# Known bug in SSL Protocols, fixed in Python 3.11: https://github.com/python/cpython/issues/89322
521+
except AttributeError:
522+
raise OSError("connection is already closed") from None
520523
if self._done_messages:
521524
message = await self._done_messages.popleft()
522525
else:
@@ -557,25 +560,23 @@ async def read(self, request_id: Optional[int], max_message_size: int) -> tuple[
557560
if overflow is not None:
558561
if is_compressed and compressor_id is not None:
559562
return decompress(
560-
memoryview(
561-
bytearray(self._buffer[start + header_size : self._end_index])
562-
+ bytearray(overflow[:overflow_index])
563-
),
563+
self._buffer[start + header_size : self._end_index].tobytes()
564+
+ overflow[:overflow_index].tobytes(),
564565
compressor_id,
565566
), op_code
566567
else:
567-
return memoryview(
568-
bytearray(self._buffer[start + header_size : self._end_index])
569-
+ bytearray(overflow[:overflow_index])
568+
return (
569+
self._buffer[start + header_size : self._end_index].tobytes()
570+
+ overflow[:overflow_index].tobytes()
570571
), op_code
571572
else:
572573
if is_compressed and compressor_id is not None:
573574
return decompress(
574-
memoryview(self._buffer[start + header_size : end]),
575+
self._buffer[start + header_size : end],
575576
compressor_id,
576577
), op_code
577578
else:
578-
return memoryview(self._buffer[start + header_size : end]), op_code
579+
return self._buffer[start + header_size : end].tobytes(), op_code
579580
raise OSError("connection closed")
580581

581582
def get_buffer(self, sizehint: int) -> memoryview:
@@ -736,8 +737,8 @@ async def _drain_helper(self) -> None:
736737
self._drain_waiter = asyncio.get_running_loop().create_future()
737738
await self._drain_waiter
738739

739-
def data(self) -> memoryview:
740-
return self._buffer
740+
def data(self) -> bytes:
741+
return self._buffer.tobytes()
741742

742743
async def wait_closed(self) -> None:
743744
await asyncio.wait([self._closed])

0 commit comments

Comments
 (0)