46
46
_HAVE_SSL = False
47
47
48
48
try :
49
- from pymongo .pyopenssl_context import (
50
- BLOCKING_IO_LOOKUP_ERROR ,
51
- BLOCKING_IO_READ_ERROR ,
52
- BLOCKING_IO_WRITE_ERROR ,
53
- _sslConn ,
54
- )
49
+ from pymongo .pyopenssl_context import _sslConn as _pysslConn
55
50
56
51
_HAVE_PYOPENSSL = True
57
52
except ImportError :
58
53
_HAVE_PYOPENSSL = False
59
- _sslConn = SSLSocket # type: ignore
60
- from pymongo .ssl_support import ( # type: ignore[assignment]
61
- BLOCKING_IO_LOOKUP_ERROR ,
62
- BLOCKING_IO_READ_ERROR ,
63
- BLOCKING_IO_WRITE_ERROR ,
64
- )
54
+ _pysslCon = SSLSocket
55
+
56
+ from pymongo .ssl_support import ( # type: ignore[assignment]
57
+ BLOCKING_IO_LOOKUP_ERROR ,
58
+ BLOCKING_IO_READ_ERROR ,
59
+ BLOCKING_IO_WRITE_ERROR ,
60
+ PYBLOCKING_IO_LOOKUP_ERROR ,
61
+ PYBLOCKING_IO_READ_ERROR ,
62
+ PYBLOCKING_IO_WRITE_ERROR ,
63
+ )
65
64
66
65
if TYPE_CHECKING :
67
66
from pymongo .asynchronous .pool import AsyncConnection
71
70
_UNPACK_COMPRESSION_HEADER = struct .Struct ("<iiB" ).unpack
72
71
_POLL_TIMEOUT = 0.5
73
72
# Errors raised by sockets (and TLS sockets) when in non-blocking mode.
74
- BLOCKING_IO_ERRORS = (BlockingIOError , BLOCKING_IO_LOOKUP_ERROR , * ssl_support .BLOCKING_IO_ERRORS )
73
+ BLOCKING_IO_ERRORS = (
74
+ BlockingIOError ,
75
+ BLOCKING_IO_LOOKUP_ERROR ,
76
+ PYBLOCKING_IO_LOOKUP_ERROR ,
77
+ * ssl_support .BLOCKING_IO_ERRORS ,
78
+ * ssl_support .PYBLOCKING_IO_ERRORS ,
79
+ )
75
80
76
81
77
82
# These socket-based I/O methods are for KMS requests and any other network operations that do not use
78
83
# the MongoDB wire protocol
79
- async def async_socket_sendall (sock : Union [socket .socket , _sslConn ], buf : bytes ) -> None :
84
+ async def async_socket_sendall (sock : Union [socket .socket , _pysslConn ], buf : bytes ) -> None :
80
85
timeout = sock .gettimeout ()
81
86
sock .settimeout (0.0 )
82
87
loop = asyncio .get_running_loop ()
83
88
try :
84
- if _HAVE_SSL and isinstance (sock , (SSLSocket , _sslConn )):
89
+ if _HAVE_SSL and isinstance (sock , (SSLSocket , _pysslConn )):
85
90
await asyncio .wait_for (_async_socket_sendall_ssl (sock , buf , loop ), timeout = timeout )
86
91
else :
87
92
await asyncio .wait_for (loop .sock_sendall (sock , buf ), timeout = timeout ) # type: ignore[arg-type]
@@ -95,7 +100,7 @@ async def async_socket_sendall(sock: Union[socket.socket, _sslConn], buf: bytes)
95
100
if sys .platform != "win32" :
96
101
97
102
async def _async_socket_sendall_ssl (
98
- sock : Union [socket .socket , _sslConn ], buf : bytes , loop : AbstractEventLoop
103
+ sock : Union [socket .socket , _pysslConn ], buf : bytes , loop : AbstractEventLoop
99
104
) -> None :
100
105
view = memoryview (buf )
101
106
sent = 0
@@ -113,21 +118,23 @@ def _is_ready(fut: Future) -> None:
113
118
# Check for closed socket.
114
119
if fd == - 1 :
115
120
raise SSLError ("Underlying socket has been closed" ) from None
116
- if isinstance (exc , BLOCKING_IO_READ_ERROR ):
121
+ if isinstance (exc , ( BLOCKING_IO_READ_ERROR , PYBLOCKING_IO_READ_ERROR ) ):
117
122
fut = loop .create_future ()
118
123
loop .add_reader (fd , _is_ready , fut )
119
124
try :
120
125
await fut
121
126
finally :
122
127
loop .remove_reader (fd )
123
- if isinstance (exc , BLOCKING_IO_WRITE_ERROR ):
128
+ if isinstance (exc , ( BLOCKING_IO_WRITE_ERROR , PYBLOCKING_IO_WRITE_ERROR ) ):
124
129
fut = loop .create_future ()
125
130
loop .add_writer (fd , _is_ready , fut )
126
131
try :
127
132
await fut
128
133
finally :
129
134
loop .remove_writer (fd )
130
- if _HAVE_PYOPENSSL and isinstance (exc , BLOCKING_IO_LOOKUP_ERROR ):
135
+ if _HAVE_PYOPENSSL and isinstance (
136
+ exc , (BLOCKING_IO_LOOKUP_ERROR , PYBLOCKING_IO_LOOKUP_ERROR )
137
+ ):
131
138
fut = loop .create_future ()
132
139
loop .add_reader (fd , _is_ready , fut )
133
140
try :
@@ -138,7 +145,7 @@ def _is_ready(fut: Future) -> None:
138
145
loop .remove_writer (fd )
139
146
140
147
async def _async_socket_receive_ssl (
141
- conn : _sslConn , length : int , loop : AbstractEventLoop , once : Optional [bool ] = False
148
+ conn : _pysslConn , length : int , loop : AbstractEventLoop , once : Optional [bool ] = False
142
149
) -> memoryview :
143
150
mv = memoryview (bytearray (length ))
144
151
total_read = 0
@@ -162,21 +169,23 @@ def _is_ready(fut: Future) -> None:
162
169
# Check for closed socket.
163
170
if fd == - 1 :
164
171
raise SSLError ("Underlying socket has been closed" ) from None
165
- if isinstance (exc , BLOCKING_IO_READ_ERROR ):
172
+ if isinstance (exc , ( BLOCKING_IO_READ_ERROR , PYBLOCKING_IO_READ_ERROR ) ):
166
173
fut = loop .create_future ()
167
174
loop .add_reader (fd , _is_ready , fut )
168
175
try :
169
176
await fut
170
177
finally :
171
178
loop .remove_reader (fd )
172
- if isinstance (exc , BLOCKING_IO_WRITE_ERROR ):
179
+ if isinstance (exc , ( BLOCKING_IO_WRITE_ERROR , PYBLOCKING_IO_WRITE_ERROR ) ):
173
180
fut = loop .create_future ()
174
181
loop .add_writer (fd , _is_ready , fut )
175
182
try :
176
183
await fut
177
184
finally :
178
185
loop .remove_writer (fd )
179
- if _HAVE_PYOPENSSL and isinstance (exc , BLOCKING_IO_LOOKUP_ERROR ):
186
+ if _HAVE_PYOPENSSL and isinstance (
187
+ exc , (BLOCKING_IO_LOOKUP_ERROR , PYBLOCKING_IO_LOOKUP_ERROR )
188
+ ):
180
189
fut = loop .create_future ()
181
190
loop .add_reader (fd , _is_ready , fut )
182
191
try :
@@ -192,7 +201,7 @@ def _is_ready(fut: Future) -> None:
192
201
# https://docs.python.org/3/library/asyncio-platforms.html#asyncio-platform-support
193
202
# Note: In PYTHON-4493 we plan to replace this code with asyncio streams.
194
203
async def _async_socket_sendall_ssl (
195
- sock : Union [socket .socket , _sslConn ], buf : bytes , dummy : AbstractEventLoop
204
+ sock : Union [socket .socket , _pysslConn ], buf : bytes , dummy : AbstractEventLoop
196
205
) -> None :
197
206
view = memoryview (buf )
198
207
total_length = len (buf )
@@ -213,7 +222,7 @@ async def _async_socket_sendall_ssl(
213
222
total_sent += sent
214
223
215
224
async def _async_socket_receive_ssl (
216
- conn : _sslConn , length : int , dummy : AbstractEventLoop , once : Optional [bool ] = False
225
+ conn : _pysslConn , length : int , dummy : AbstractEventLoop , once : Optional [bool ] = False
217
226
) -> memoryview :
218
227
mv = memoryview (bytearray (length ))
219
228
total_read = 0
@@ -239,7 +248,7 @@ async def _async_socket_receive_ssl(
239
248
return mv
240
249
241
250
242
- def sendall (sock : Union [socket .socket , _sslConn ], buf : bytes ) -> None :
251
+ def sendall (sock : Union [socket .socket , _pysslConn ], buf : bytes ) -> None :
243
252
sock .sendall (buf )
244
253
245
254
@@ -252,15 +261,15 @@ async def _poll_cancellation(conn: AsyncConnection) -> None:
252
261
253
262
254
263
async def async_receive_data_socket (
255
- sock : Union [socket .socket , _sslConn ], length : int
264
+ sock : Union [socket .socket , _pysslConn ], length : int
256
265
) -> memoryview :
257
266
sock_timeout = sock .gettimeout ()
258
267
timeout = sock_timeout
259
268
260
269
sock .settimeout (0.0 )
261
270
loop = asyncio .get_running_loop ()
262
271
try :
263
- if _HAVE_SSL and isinstance (sock , (SSLSocket , _sslConn )):
272
+ if _HAVE_SSL and isinstance (sock , (SSLSocket , _pysslConn )):
264
273
return await asyncio .wait_for (
265
274
_async_socket_receive_ssl (sock , length , loop , once = True ), # type: ignore[arg-type]
266
275
timeout = timeout ,
@@ -435,7 +444,7 @@ def sock(self) -> socket.socket:
435
444
436
445
437
446
class NetworkingInterface (NetworkingInterfaceBase ):
438
- def __init__ (self , conn : Union [socket .socket , _sslConn ]):
447
+ def __init__ (self , conn : Union [socket .socket , _pysslConn ]):
439
448
super ().__init__ (conn )
440
449
441
450
def gettimeout (self ) -> float | None :
@@ -451,11 +460,11 @@ def is_closing(self) -> bool:
451
460
return self .conn .is_closing ()
452
461
453
462
@property
454
- def get_conn (self ) -> Union [socket .socket , _sslConn ]:
463
+ def get_conn (self ) -> Union [socket .socket , _pysslConn ]:
455
464
return self .conn
456
465
457
466
@property
458
- def sock (self ) -> Union [socket .socket , _sslConn ]:
467
+ def sock (self ) -> Union [socket .socket , _pysslConn ]:
459
468
return self .conn
460
469
461
470
def fileno (self ) -> int :
0 commit comments