Coverage for Lib/asyncio/trsock.py: 87%
60 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-15 02:02 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-15 02:02 +0000
1import socket
4class TransportSocket:
6 """A socket-like wrapper for exposing real transport sockets.
8 These objects can be safely returned by APIs like
9 `transport.get_extra_info('socket')`. All potentially disruptive
10 operations (like "socket.close()") are banned.
11 """
13 __slots__ = ('_sock',)
15 def __init__(self, sock: socket.socket):
16 self._sock = sock
18 @property
19 def family(self):
20 return self._sock.family
22 @property
23 def type(self):
24 return self._sock.type
26 @property
27 def proto(self):
28 return self._sock.proto
30 def __repr__(self):
31 s = (
32 f"<asyncio.TransportSocket fd={self.fileno()}, "
33 f"family={self.family!s}, type={self.type!s}, "
34 f"proto={self.proto}"
35 )
37 if self.fileno() != -1: 37 ↛ 51line 37 didn't jump to line 51 because the condition on line 37 was always true
38 try:
39 laddr = self.getsockname()
40 if laddr: 40 ↛ 44line 40 didn't jump to line 44 because the condition on line 40 was always true
41 s = f"{s}, laddr={laddr}"
42 except socket.error:
43 pass
44 try:
45 raddr = self.getpeername()
46 if raddr: 46 ↛ 51line 46 didn't jump to line 51 because the condition on line 46 was always true
47 s = f"{s}, raddr={raddr}"
48 except socket.error:
49 pass
51 return f"{s}>"
53 def __getstate__(self):
54 raise TypeError("Cannot serialize asyncio.TransportSocket object")
56 def fileno(self):
57 return self._sock.fileno()
59 def dup(self):
60 return self._sock.dup()
62 def get_inheritable(self):
63 return self._sock.get_inheritable()
65 def shutdown(self, how):
66 # asyncio doesn't currently provide a high-level transport API
67 # to shutdown the connection.
68 self._sock.shutdown(how)
70 def getsockopt(self, *args, **kwargs):
71 return self._sock.getsockopt(*args, **kwargs)
73 def setsockopt(self, *args, **kwargs):
74 self._sock.setsockopt(*args, **kwargs)
76 def getpeername(self):
77 return self._sock.getpeername()
79 def getsockname(self):
80 return self._sock.getsockname()
82 def getsockbyname(self):
83 return self._sock.getsockbyname()
85 def settimeout(self, value):
86 if value == 0:
87 return
88 raise ValueError(
89 'settimeout(): only 0 timeout is allowed on transport sockets')
91 def gettimeout(self):
92 return 0
94 def setblocking(self, flag):
95 if not flag:
96 return
97 raise ValueError(
98 'setblocking(): transport sockets cannot be blocking')