1*cda5da8dSAndroid Build Coastguard Workerimport socket 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker 4*cda5da8dSAndroid Build Coastguard Workerclass TransportSocket: 5*cda5da8dSAndroid Build Coastguard Worker 6*cda5da8dSAndroid Build Coastguard Worker """A socket-like wrapper for exposing real transport sockets. 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard Worker These objects can be safely returned by APIs like 9*cda5da8dSAndroid Build Coastguard Worker `transport.get_extra_info('socket')`. All potentially disruptive 10*cda5da8dSAndroid Build Coastguard Worker operations (like "socket.close()") are banned. 11*cda5da8dSAndroid Build Coastguard Worker """ 12*cda5da8dSAndroid Build Coastguard Worker 13*cda5da8dSAndroid Build Coastguard Worker __slots__ = ('_sock',) 14*cda5da8dSAndroid Build Coastguard Worker 15*cda5da8dSAndroid Build Coastguard Worker def __init__(self, sock: socket.socket): 16*cda5da8dSAndroid Build Coastguard Worker self._sock = sock 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Worker @property 19*cda5da8dSAndroid Build Coastguard Worker def family(self): 20*cda5da8dSAndroid Build Coastguard Worker return self._sock.family 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard Worker @property 23*cda5da8dSAndroid Build Coastguard Worker def type(self): 24*cda5da8dSAndroid Build Coastguard Worker return self._sock.type 25*cda5da8dSAndroid Build Coastguard Worker 26*cda5da8dSAndroid Build Coastguard Worker @property 27*cda5da8dSAndroid Build Coastguard Worker def proto(self): 28*cda5da8dSAndroid Build Coastguard Worker return self._sock.proto 29*cda5da8dSAndroid Build Coastguard Worker 30*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 31*cda5da8dSAndroid Build Coastguard Worker s = ( 32*cda5da8dSAndroid Build Coastguard Worker f"<asyncio.TransportSocket fd={self.fileno()}, " 33*cda5da8dSAndroid Build Coastguard Worker f"family={self.family!s}, type={self.type!s}, " 34*cda5da8dSAndroid Build Coastguard Worker f"proto={self.proto}" 35*cda5da8dSAndroid Build Coastguard Worker ) 36*cda5da8dSAndroid Build Coastguard Worker 37*cda5da8dSAndroid Build Coastguard Worker if self.fileno() != -1: 38*cda5da8dSAndroid Build Coastguard Worker try: 39*cda5da8dSAndroid Build Coastguard Worker laddr = self.getsockname() 40*cda5da8dSAndroid Build Coastguard Worker if laddr: 41*cda5da8dSAndroid Build Coastguard Worker s = f"{s}, laddr={laddr}" 42*cda5da8dSAndroid Build Coastguard Worker except socket.error: 43*cda5da8dSAndroid Build Coastguard Worker pass 44*cda5da8dSAndroid Build Coastguard Worker try: 45*cda5da8dSAndroid Build Coastguard Worker raddr = self.getpeername() 46*cda5da8dSAndroid Build Coastguard Worker if raddr: 47*cda5da8dSAndroid Build Coastguard Worker s = f"{s}, raddr={raddr}" 48*cda5da8dSAndroid Build Coastguard Worker except socket.error: 49*cda5da8dSAndroid Build Coastguard Worker pass 50*cda5da8dSAndroid Build Coastguard Worker 51*cda5da8dSAndroid Build Coastguard Worker return f"{s}>" 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Worker def __getstate__(self): 54*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Cannot serialize asyncio.TransportSocket object") 55*cda5da8dSAndroid Build Coastguard Worker 56*cda5da8dSAndroid Build Coastguard Worker def fileno(self): 57*cda5da8dSAndroid Build Coastguard Worker return self._sock.fileno() 58*cda5da8dSAndroid Build Coastguard Worker 59*cda5da8dSAndroid Build Coastguard Worker def dup(self): 60*cda5da8dSAndroid Build Coastguard Worker return self._sock.dup() 61*cda5da8dSAndroid Build Coastguard Worker 62*cda5da8dSAndroid Build Coastguard Worker def get_inheritable(self): 63*cda5da8dSAndroid Build Coastguard Worker return self._sock.get_inheritable() 64*cda5da8dSAndroid Build Coastguard Worker 65*cda5da8dSAndroid Build Coastguard Worker def shutdown(self, how): 66*cda5da8dSAndroid Build Coastguard Worker # asyncio doesn't currently provide a high-level transport API 67*cda5da8dSAndroid Build Coastguard Worker # to shutdown the connection. 68*cda5da8dSAndroid Build Coastguard Worker self._sock.shutdown(how) 69*cda5da8dSAndroid Build Coastguard Worker 70*cda5da8dSAndroid Build Coastguard Worker def getsockopt(self, *args, **kwargs): 71*cda5da8dSAndroid Build Coastguard Worker return self._sock.getsockopt(*args, **kwargs) 72*cda5da8dSAndroid Build Coastguard Worker 73*cda5da8dSAndroid Build Coastguard Worker def setsockopt(self, *args, **kwargs): 74*cda5da8dSAndroid Build Coastguard Worker self._sock.setsockopt(*args, **kwargs) 75*cda5da8dSAndroid Build Coastguard Worker 76*cda5da8dSAndroid Build Coastguard Worker def getpeername(self): 77*cda5da8dSAndroid Build Coastguard Worker return self._sock.getpeername() 78*cda5da8dSAndroid Build Coastguard Worker 79*cda5da8dSAndroid Build Coastguard Worker def getsockname(self): 80*cda5da8dSAndroid Build Coastguard Worker return self._sock.getsockname() 81*cda5da8dSAndroid Build Coastguard Worker 82*cda5da8dSAndroid Build Coastguard Worker def getsockbyname(self): 83*cda5da8dSAndroid Build Coastguard Worker return self._sock.getsockbyname() 84*cda5da8dSAndroid Build Coastguard Worker 85*cda5da8dSAndroid Build Coastguard Worker def settimeout(self, value): 86*cda5da8dSAndroid Build Coastguard Worker if value == 0: 87*cda5da8dSAndroid Build Coastguard Worker return 88*cda5da8dSAndroid Build Coastguard Worker raise ValueError( 89*cda5da8dSAndroid Build Coastguard Worker 'settimeout(): only 0 timeout is allowed on transport sockets') 90*cda5da8dSAndroid Build Coastguard Worker 91*cda5da8dSAndroid Build Coastguard Worker def gettimeout(self): 92*cda5da8dSAndroid Build Coastguard Worker return 0 93*cda5da8dSAndroid Build Coastguard Worker 94*cda5da8dSAndroid Build Coastguard Worker def setblocking(self, flag): 95*cda5da8dSAndroid Build Coastguard Worker if not flag: 96*cda5da8dSAndroid Build Coastguard Worker return 97*cda5da8dSAndroid Build Coastguard Worker raise ValueError( 98*cda5da8dSAndroid Build Coastguard Worker 'setblocking(): transport sockets cannot be blocking') 99