You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

210 lines
5.2 KiB

  1. cdef class PseudoSocket:
  2. cdef:
  3. int _family
  4. int _type
  5. int _proto
  6. int _fd
  7. object _peername
  8. object _sockname
  9. def __init__(self, int family, int type, int proto, int fd):
  10. self._family = family
  11. self._type = type
  12. self._proto = proto
  13. self._fd = fd
  14. self._peername = None
  15. self._sockname = None
  16. cdef _na(self, what):
  17. raise TypeError('transport sockets do not support {}'.format(what))
  18. cdef _make_sock(self):
  19. return socket_socket(self._family, self._type, self._proto, self._fd)
  20. property family:
  21. def __get__(self):
  22. try:
  23. return socket_AddressFamily(self._family)
  24. except ValueError:
  25. return self._family
  26. property type:
  27. def __get__(self):
  28. try:
  29. return socket_SocketKind(self._type)
  30. except ValueError:
  31. return self._type
  32. property proto:
  33. def __get__(self):
  34. return self._proto
  35. def __repr__(self):
  36. s = ("<uvloop.PseudoSocket fd={}, family={!s}, "
  37. "type={!s}, proto={}").format(self.fileno(), self.family,
  38. self.type, self.proto)
  39. if self._fd != -1:
  40. try:
  41. laddr = self.getsockname()
  42. if laddr:
  43. s += ", laddr=%s" % str(laddr)
  44. except socket_error:
  45. pass
  46. try:
  47. raddr = self.getpeername()
  48. if raddr:
  49. s += ", raddr=%s" % str(raddr)
  50. except socket_error:
  51. pass
  52. s += '>'
  53. return s
  54. def __getstate__(self):
  55. raise TypeError("Cannot serialize socket object")
  56. def fileno(self):
  57. return self._fd
  58. def dup(self):
  59. fd = os_dup(self._fd)
  60. sock = socket_socket(self._family, self._type, self._proto, fileno=fd)
  61. sock.settimeout(0)
  62. return sock
  63. def get_inheritable(self):
  64. return os_get_inheritable(self._fd)
  65. def set_inheritable(self):
  66. os_set_inheritable(self._fd)
  67. def ioctl(self, *args, **kwargs):
  68. pass
  69. def getsockopt(self, *args, **kwargs):
  70. sock = self._make_sock()
  71. try:
  72. return sock.getsockopt(*args, **kwargs)
  73. finally:
  74. sock.detach()
  75. def setsockopt(self, *args, **kwargs):
  76. sock = self._make_sock()
  77. try:
  78. return sock.setsockopt(*args, **kwargs)
  79. finally:
  80. sock.detach()
  81. def getpeername(self):
  82. if self._peername is not None:
  83. return self._peername
  84. sock = self._make_sock()
  85. try:
  86. self._peername = sock.getpeername()
  87. return self._peername
  88. finally:
  89. sock.detach()
  90. def getsockname(self):
  91. if self._sockname is not None:
  92. return self._sockname
  93. sock = self._make_sock()
  94. try:
  95. self._sockname = sock.getsockname()
  96. return self._sockname
  97. finally:
  98. sock.detach()
  99. def share(self, process_id):
  100. sock = self._make_sock()
  101. try:
  102. return sock.share(process_id)
  103. finally:
  104. sock.detach()
  105. def accept(self):
  106. self._na('accept() method')
  107. def connect(self, *args):
  108. self._na('connect() method')
  109. def connect_ex(self, *args):
  110. self._na('connect_ex() method')
  111. def bind(self, *args):
  112. self._na('bind() method')
  113. def listen(self, *args, **kwargs):
  114. self._na('listen() method')
  115. def makefile(self):
  116. self._na('makefile() method')
  117. def sendfile(self, *args, **kwargs):
  118. self._na('sendfile() method')
  119. def close(self):
  120. self._na('close() method')
  121. def detach(self):
  122. self._na('detach() method')
  123. def shutdown(self, *args):
  124. self._na('shutdown() method')
  125. def sendmsg_afalg(self, *args, **kwargs):
  126. self._na('sendmsg_afalg() method')
  127. def sendmsg(self):
  128. self._na('sendmsg() method')
  129. def sendto(self, *args, **kwargs):
  130. self._na('sendto() method')
  131. def send(self, *args, **kwargs):
  132. self._na('send() method')
  133. def sendall(self, *args, **kwargs):
  134. self._na('sendall() method')
  135. def recv_into(self, *args, **kwargs):
  136. self._na('recv_into() method')
  137. def recvfrom_into(self, *args, **kwargs):
  138. self._na('recvfrom_into() method')
  139. def recvmsg_into(self, *args, **kwargs):
  140. self._na('recvmsg_into() method')
  141. def recvmsg(self, *args, **kwargs):
  142. self._na('recvmsg() method')
  143. def recvfrom(self, *args, **kwargs):
  144. self._na('recvfrom() method')
  145. def recv(self, *args, **kwargs):
  146. self._na('recv() method')
  147. def settimeout(self, value):
  148. if value == 0:
  149. return
  150. raise ValueError(
  151. 'settimeout(): only 0 timeout is allowed on transport sockets')
  152. def gettimeout(self):
  153. return 0
  154. def setblocking(self, flag):
  155. if not flag:
  156. return
  157. raise ValueError(
  158. 'setblocking(): transport sockets cannot be blocking')
  159. def __enter__(self):
  160. self._na('context manager protocol')
  161. def __exit__(self, *err):
  162. self._na('context manager protocol')