MCPcopy Index your code
hub / github.com/mongodb/mongo-python-driver / _async_socket_receive_ssl

Function _async_socket_receive_ssl

pymongo/network_layer.py:136–184  ·  view source on GitHub ↗
(
        conn: _sslConn, length: int, loop: AbstractEventLoop, once: Optional[bool] = False
    )

Source from the content-addressed store, hash-verified

134 loop.remove_writer(fd)
135
136 async def _async_socket_receive_ssl(
137 conn: _sslConn, length: int, loop: AbstractEventLoop, once: Optional[bool] = False
138 ) -> memoryview:
139 mv = memoryview(bytearray(length))
140 total_read = 0
141
142 def _is_ready(fut: Future[Any]) -> None:
143 if fut.done():
144 return
145 fut.set_result(None)
146
147 while total_read < length:
148 try:
149 read = conn.recv_into(mv[total_read:])
150 if read == 0:
151 raise OSError("connection closed")
152 # KMS responses update their expected size after the first batch, stop reading after one loop
153 if once:
154 return mv[:read]
155 total_read += read
156 except BLOCKING_IO_ERRORS as exc:
157 fd = conn.fileno()
158 # Check for closed socket.
159 if fd == -1:
160 raise SSLError("Underlying socket has been closed") from None
161 if isinstance(exc, BLOCKING_IO_READ_ERROR):
162 fut = loop.create_future()
163 loop.add_reader(fd, _is_ready, fut)
164 try:
165 await fut
166 finally:
167 loop.remove_reader(fd)
168 if isinstance(exc, BLOCKING_IO_WRITE_ERROR):
169 fut = loop.create_future()
170 loop.add_writer(fd, _is_ready, fut)
171 try:
172 await fut
173 finally:
174 loop.remove_writer(fd)
175 if _HAVE_PYOPENSSL and isinstance(exc, BLOCKING_IO_LOOKUP_ERROR):
176 fut = loop.create_future()
177 loop.add_reader(fd, _is_ready, fut)
178 try:
179 loop.add_writer(fd, _is_ready, fut)
180 await fut
181 finally:
182 loop.remove_reader(fd)
183 loop.remove_writer(fd)
184 return mv
185
186else:
187 # The default Windows asyncio event loop does not support loop.add_reader/add_writer:

Callers 1

Calls 3

SSLErrorClass · 0.90
recv_intoMethod · 0.45
filenoMethod · 0.45

Tested by

no test coverage detected